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:

  1. 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
  2. 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,
Jane

Angelegt: 2005/01/10
Letzte Bearbeitung: 2005/06/11 / 14:11:00