Auf einem bei Hostpoint gehosteten Web-Server eines Kunden laufen …
- Apache 1.3.37
- PHP 5.1.6 (als CGI)
- Drupal 5.1, 2007-01-29
Rufe ich die Test-Seite auf, die die korrekte Arbeitsweise von „Clean URLs“ überprüft, gibt es Probleme beim Laden der Stylesheets.
Nach etwa einer geschlagenen Stunde debugging weiss ich nun endlich, wieso:
Die Funktion base_path() in /includes/common.inc, die unter anderem auch von drupal_get_css() aufgerufen wird, liefert in der obigen Server-Konfiguration (PHP als CGI, verdammt seist du!) einen falschen Pfad zurück:
Aktuelle URL: http://www.server.tld/node/8
PHP-Snippet: print($GLOBALS['base_path']);
Ausgabe: /node/
Deshalb werden die @imports auf die Stylesheets mit einem falschen Pfad versehen, was wiederum die in der .htaccess angegeben mod_rewrite-Regeln (die Zeilen sind übrigens ein Höchstmass an Effizienz, da werden meine Augen jedesmal feucht) zum Fehlglauben verleitet, die angefragten Stylesheets existierten nicht:
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Stattdessen wird die Anfrage an das Script index.php weitergeleitet, das nun text/html ausliefert und die Browser ausser Tritt bringt. Seiten werden so pro eingebundenem Stylesheet um je 10KB schwerer für den Download.
Lösung
(Gemäss problem with clean url – duplicate path and other strange issues)
Man aktiviere in der Datei /sites/default/settings.php folgende Einstellung (ca. Zeile 115):
$base_url = 'http://www.server.tld'; //NO trailing slash!
Die nun mit SEF-URLs ausgelieferte Seite funktioniert tadellos und enthält die korrekten Verweise im Header:
<style type="text/css" media="all">@import "/modules/node/node.css";</style> <style type="text/css" media="all">@import "/modules/system/admin.css";</style> <style type="text/css" media="all">@import "/modules/system/defaults.css";</style> <style type="text/css" media="all">@import "/modules/system/system.css";</style> <style type="text/css" media="all">@import "/modules/user/user.css";</style> <style type="text/css" media="all">@import "/themes/garland/style.css";</style> <style type="text/css" media="all">@import "/themes/garland/ride.css";</style> <style type="text/css" media="print">@import "/themes/garland/print.css";</style>