www.alexander-merz.com | Alexander Merz

PHPX statt PHP

Die Endung für eine PHP-Datei ist an sich frei wählbar. Schließlich kann ein Webserver entsprechend konfiguriert werden, welche Dateien er wie behandeln soll. Dachte ich zumindest. Für das Gespann Tomcat&PHP gilt das aber auf den ersten Blick nicht.

Konkret bekam ich eine Anfrage, was man tun muss, damit Tomcat PHP-Skripte mit der Endung .phpx ausführt. Das x soll angehängt werden, wenn sich darin Code befindet, der nur mit Tomcat als Server funktioniert.

Meine erste Idee war, dass man einfach die Konfiguration in der web.xml ergänzt:

<servlet-mapping>
 <servlet-name>JSR223Script</servlet-name>
 <url-pattern>*.phpx</url-pattern>
</servlet-mapping>

Als ich versucht ein entsprechend benanntes Skript aufzurufen, erhielt ich aber nur eine Fehlermeldung von Tomcat. Was lief da fehl?

Nach einigen Nachforschung und Wühlarbeit war der Grund klar. Die sogenannten Skript-Engines registrieren sich beim JSR223Script-Servlet mit einem eindeutigen Bezeichner. Im Fall der PHP-Engine ist es "php".

Wird nun eine URL aufgerufen, z.B. test.phpx, prüft Tomcat wer sich dafür zuständig fühlt. Nach obiger Konfiguration ist es das JSR223-Servlet. Soweit läuft es wie gewünscht. Das Servlet selbst aber prüft die URL erneut, um herauszufinden, welche Engine es aufrufen soll. Und hier entsteht das Problem: Die Prüfung erfolgt über die Dateiendung – und eine Engine, die sich mit phpx registriert hat, existiert nicht.

Mein nächster Gedanke war deshalb, herauszufinden, ob es möglich ist, den Bezeichner der Engine entsprechend zu konfigurieren. Keine Chance, der Bezeichner ist fest kodiert.

Als Resultat trug ich mich bereits mit dem Gedanken, kurzerhand eine eigene Implementierung des Servlets zu realisieren, welches eine konfigurierbare Zuordnung von Dateiendung zu Engine erlaubt. Beim Studieren des Jar-Archivs script.jar, um die Funktionsweise der Implementierung besser zu verstehen, stolperte ich quasi durch Zufall über eine Klasse mit einem verlockendem Namen: com.sun.script.php.PHPServlet. Sollte ich damit das Ziel erreichen können, ohne zu programmieren?

Kurzerhand ergänzte ich in web.xml den entsprechenden Servlet-Eintrag:

<servlet>
 <servlet-name>PHPScript</servlet-name>
 <servlet-class>com.sun.script.php.PHPServlet</servlet-class>
</servlet>
Und fügte die entsprechende Mapping-Konfiguration hinzu:
<servlet-mapping>
 <servlet-name>PHPScript</servlet-name>
 <url-pattern>*.phpx</url-pattern>
</servlet-mapping>
(Natürlich muss die Änderung vom Anfang wieder rückgängig gemacht werden!)

Und siehe da, es funktionierte! Auch mit dem PHPServlet stehen alle Tomcat-Features im PHP-Skript zur Verfügung. Zumindest für PHP kann also die Dateiendung auch unter Tomcat frei gewählt werden.