Datei-Typ ändern
PHP in *.html-Dateien verwenden
Wie mittels der AddType
-Direktive beim
Apache-Webserver der content type geändert werden kann, wurde
bereits gezeigt. Damit ist allerdings noch viel mehr möglich.
z. B. kannst Du den Server anweisen, Dateien mit der Endung *.html als PHP-Dateien zu behandeln, also enthaltenen PHP-Code zu bearbeiten. Der Vorteil davon ist: Der Besucher bekommt ohnehin nur HTML ausgeliefert; welche serverseitige Technik das fertige HTML-Dokument zusammengebaut hat, kann ihm also ganz egal sein; unerfahrenere Besucher lassen sich sogar durch die ungwöhnliche Namensendung *.php irritieren. Probiere es mal mit folgendem Eintrag in der .htaccess-Datei:
AddType application/x-httpd-php .html
Auch hier gilt, daß Du Angaben für mehrere Dateitypen gleichzeitig machen kannst – sogar CSS-Ressourcen kannst Du also dynamisch erstellen lassen:
AddType application/x-httpd-php .html .htm .php .css
Achtung! Durch diese Einstellungen werden natürlich alle *.html-, *.htm-, *.php- und *.css-Dateien als PHP behandelt, selbst dann, wenn sie gar keinen PHP-Code enthalten! Das führt zu unnötiger Serverlast. Beschränke diese Methode also auf „echte“ PHP-Dateien, z. B. indem Du diese Einstellungen nur in bestimmten Unterordnern vornimmst bzw. indem Du die reinen HTML-Dateien in einen Unterordner legst, in welchem Du die hier besprochene Einstellung wieder rückgängig machst:
AddType text/html .html
Anmerkung zur Verwendung von PHP in *.css-Dateien
Achtung! Solltest Du auch CSS-Ressourcen auf diese Weise dynamisch erstellen lassen, dann tritt das im Artikel zur Änderung des content type erwähnte Problem auf: Per PHP erzeugte Ressourcen werden standardmäßig nämlich immer als text/html verschickt (das ist meistens ja auch gewünscht), weshalb regelkonforme Browser unsere schönen CSS-Ressourcen nun nicht mehr interpretieren.
Durch unsere Technik-Gier haben wir uns scheinbar sehr unelegant in eine Zwickmühle manövriert: Entweder wir schreiben CSS aufwendig von Hand (so daß es funktioniert), oder wir lassen es bequem dynamisch generieren – und es funktioniert nicht.
Aber auch hier gibt es glücklicherweise eine einfache Lösung:
HTTP-header per PHP versenden
Per PHP läßt sich angeben, mit welchem HTTP-header die Ressource verschickt werden soll. Der Server würde automatisch den Standardwert („text/html“) wählen, doch mit einer Zusatzinformation läßt sich ihm dieses Verhalten leicht austreiben. Schreibe folgende Zeile ganz an den Anfang Deiner CSS/PHP-Mischdatei:
<?php header('content-type: text/css'); [weitere PHP-Befehle] ?>
Diese Zeile sollte deshalb ganz am Anfang der Mischdatei stehen, da,
sobald das PHP-Skript etwas von sich gibt – z. B. wenn per
echo
Daten in die Ressource geschrieben werden –
bereits automatisch ein header verschickt wird,
und zwar der unerwünschte mit „text/html“. Der Server gibt
in dem Fall etwa folgende Fehlermeldung aus (das wird so in die
CSS-Ressource geschrieben!):
Warning: Cannot modify header information - headers already sent by (output started at /var/www/jane/faq.bubax.net/sheets/faqbasic.css.php:10) in /var/www/jane/faq.bubax.net/sheets/faqbasic.css.php on line 18
Zum Generieren von CSS per PHP benötigen wir also zwei Komponenten:
- Einen Eintrag in der .htaccess-Datei, der den Server auch Dateien mit
der Endung .css als PHP behandeln läßt:
AddType application/x-httpd-php .css
- Einen Eintrag in der CSS/PHP-Mischdatei, der den
Server die entstandene Ressource als text/css verschicken läßt:
header('content-type: text/css');
Es sieht anfangs vielleicht also sehr kompliziert aus, aber es handelt sich letztlich doch nur um zwei Zeilen Code... probier’s einfach mal aus.
Mehr Flexibilität mit mod_rewrite
Übrigens wende ich dieses Verfahren bei einer der CSS-Ressourcen dieser
FAQ auch tatsächlich an; für das Fehlerbeispiel oben habe ich eben extra
einen Fehler erzeugt... Da die Datei zusammen mit gewöhnlichen
statischen CSS-Dateien in einem Ordner liegen soll, lasse ich ihren Namen
allerdings weiterhin auf .php enden (einen Eintrag in der .htaccess-Datei
benötige ich dafür also nicht). Mit Hilfe der
mod_rewrite
-Direktive (dazu ein andermal mehr...) lasse ich
sie aber unter einem anderen Namen (nämlich mit der Endung .css)
ausliefern. Der dazu notwendige Eintrag in der .htaccess-Datei könnte z. B.
so aussehen:
RewriteEngine On RewriteRule ^offizieller_name\.css$ eigener_name.css.php
(Das bedeutet: „Wenn von einem Besucher eine Ressource namens offizieller_name.css angefordert wird, dann verwende stattdessen eigener_name.css.php.“)
Auch hier aber muß ich mit dem oben erwähnten PHP-Einzeiler einen geeigneten HTTP-header versenden.
Liebe Grüße,