Grüssi :-)
Ich möchte dass alle xml-Dateien auf dem Webspace mit einer einzigen PHP-Funktion gehandelt werden. Wenn man also im Browser aufruft:
http://www.x.y.z/index.xml
möchte ich dass der alte Indianer das auf http://www.x.y.z/open.php umleitet und die PATH_INFO als Parameter übergibt. Ich muss in open.php nämlich die xml-Datei parsen! Am besten sollte aber das nur Serverintern ablaufen! Denn index.xml sollte in der Adressleiste stehen bleiben (Zwecks Vorwärtskompatibilität) ich mag keine open.php?url=/index.xml URLs, abgesehen davon dass ich jetzt weiss, dass das keine korrekten URL-Angaben sind ;-)
Für die Ewigkeit (und so manchen Archivleser):
Ich (zugegebenermassen nicht allein) hab genau das auch ohne mod_rewrite hinbekommen. Ich definierte mir einen Handler im Webserver, und eine dazugehörige Action, und legte los:
Ich erweiterte also zuerst meine httpd.conf um folgende zwei Zeilen:
AddHandler xml-handler .xml
Action xml-handler /open.php
Diese Anweisungen können ebenso in folgenden Kontexts stehen: In der ServerConfig (z.b.: httpd.conf) in einem <virtualhost>, <directory>, oder auch in der htaccess-Datei!
Ich definierte mir also einen Handler namens "xml-handler" der auf alle xml-Dateien in diesem und dessen Unterverzeichnissen lauscht. Und eine mit diesem Handler verbundene Action, also eine Funktion, ein Script, das Dateien dieses Typs (xml) "handlen" soll.
Handler können entweder frei gewählt werden, oder den MIME-Type spezifizieren. Es wären also auch folgende Anweisungen gültig:
AddHandler text/xml .xml
Action text/xml /open.php
Das wärs eigentlich schon ;-) Somit wird jeder Request für eine xml-Datei intern in einen Request "umgeleitet" der folgendermassen aussieht:
GET /php/php.exe/open.php/test.xml HTTP/1.1
[Die Antwort auf die Frage nach den Sicherheitsrisiken überlasse ich jemand kompetenterem ;-)]
Da es sich hier um einen CGI-Aufruf handelt muss man vorher den richtigen Content-Type-Header ausgeben. In PHP scheint das automatisch zu passieren. Man kann aber auch mit der header()-Funktion händisch nachhelfen ;-) In Perl geht aber nichts an einem
print "Content-type: text/html\n\n";
vorbei ;-) Nichtsdestotrotz hatte ich Probleme beim Aufruf von test.xml [1] Es kam immer eine 500er-Fehlermeldung, wobei im ErrorLog von Apache zu lesen war:
Premature End of Script Headers: /php/php.exe :-(
Nach langem Herumtüfteln habe ich versucht den PHP-Interpreter nicht standardmässig als binary in den Apache einzubauen, sondern ihn als Apache-Modul laufen zu lassen, und schwuppsdiwupps, klappte plötzlich alles, und sämtliche grauen Haare, die ich währenddessen lassen musste, schienen vergessen ;-)
Nach ein wenig Herumspielen mit dieser neuen Errungenschaft, bin ich auf einige nützliche Eigenschaften gestossen. Man kann in bestimmten HTTP-Umgebungsvariablen sehr nützliche informationen herauslesen. Mir liefert zum Beispiel PATH_TRANSLATED den absoluten Pfad zu der Datei, die Aufgerufen wurde. PATH_INFO enthält den relativen Pfad vom web-Root-Verzeichnis aus gesehen, PHP_SELF beinhaltet in diesem Fall auch den SCRIPT_NAME. Ein wie ich finde besonderes Zuckerl dieser Variante ist, dass man Parameter, die an den HTTP-Request angehängt werden ganz normal durch die gängigen CGI-Parameter abfragen abgerufen werden können.
Hier meine Beispieldateien zum Ausprobieren:
/test.xml:
----------
<?xml version="1.0" standalone="yes" ?>
<test>Dies ist nur ein Test</test>
/open.php:
----------
<?
echo "PHP_SELF: ".$HTTP_SERVER_VARS['PHP_SELF']."\n";
echo "PATH_INFO: ".$HTTP_SERVER_VARS['PATH_INFO']."\n";
echo "PATH_TRANSLATED: ".$HTTP_SERVER_VARS['PATH_TRANSLATED']."\n";
echo "SCRIPT_NAME: ".$SCRIPT_NAME."\n";
echo "Parameter 'id': ".$id."\n";
?>
htaccess:
---------
AddType application/x-httpd-php .php
AddHandler text/xml .xml
Action text/xml /open.php
http.conf: (PHP als Modul)
----------
LoadModule php4_module c:/php/sapi/php4apache.dll
Bei einem Aufruf:
http://testsuite/test.xml?id=probiermamal
gibt das Test-Script folgenden Output zurück:
PHP_SELF: /open.php/test.xml
PATH_INFO: /test.xml
PATH_TRANSLATED: c:\httpd\apache\htdocs\testsuite\test.xml
SCRIPT_NAME: /open.php
Parameter 'id': probiermamal
Somit wären alle meine Probleme gelöst *fg* Bis auf das Rätsel, warum das (in PHP) nur mit einer Installation als Modul funktioniert. Aber vielleicht komm ich da ja auch noch drauf, irgendwann mal ;-)
lg und trotzdem Danke für deine Tipps zu mod_rewrite :-)
bernhard
PS: Ich kann nur hoffen, dass hier unten noch genug Leute mitlesen, damit mein Posting es ins Archiv schafft. Allein schon weil ich vielleicht später mal wieder sowas machen will und dann was brauch wo ich nachlesen kann wie ich das gemacht habe *g*