Moin Moin!
Ok, das klingt sehr interessant, aber nun habe ich kein Plan, was STDIN ist bzw. wie ich in PHP überhaupt darauf zugreife.
<textadventure>Benutze STDIN mit Google</textadventure>
Was ich übrigens eigentlich bezwecken wollte ist folgendes, wozu ich erst auch ein zweites Thema starten wollte: Wer Wikipedia kennt, der weiß bestimmt, dass in der Adresse zum Beispiel "...de/Wikipedia:Hauptseite" stehen kann.
Richtig, die vollständige URL ist http://de.wikipedia.org/wiki/Wikipedia:Hauptseite
"Wikipedia:Hauptseite" kann aber keine existierende Seite auf dem Server sein,
Warum nicht? Bekommst Du unter der URL eine 404-Seite?
Natürlich nicht. Die Seite existiert auf dem Server, und sie wird Dir mit Status 200 OK ausgeliefert.
weil es einen Doppelpunkt enthält, was soweit ich weiß in Dateinamen nicht erlaubt ist.
Natürlich sind Doppelpunkte in Dateinamen erlaubt. Einige Krüppel-Betriebssysteme vertragen keine Doppelpunkte in Dateinamen, aber deswegen sind sie nicht generell verboten.
Aber was haben Dateinamen mit der genannten URL der Wikipedia zu tun?
Richtig, absolut GAR NICHTS! Die Seiten, die Du in der Oberfläche der Wikipedia siehst, stammen nahezu zu 100% aus einer (MySQL?-)Datenbank.
Außerdem ist auch eine Adresse wie "...de//" problemlos möglich.
Ja und? Nach dem ersten Slash nach dem Hostnamen ist in der URL so ziemlich alles erlaubt. Wenn Du einen lustigen Tag hast, kannst Du dort Slashes, Backslashes und sonstige wirre Zeichen lagern, wie Du lustig bist, und für jede Kombination eine andere Seite ausliefern.
Ich habe herausgefunden, dass ich sowas mit einem 404-"Redirect" machen könnte, wo PHP dann die Adresse oben auslesen und auswerten kann. Nur da fehlen mir leider die POST-Daten.
Großer Mumpitz. Sieh Dir die URL nochmal genau an. Was steht zwischen "http://de.wikipedia.org/" und "Wikipedia:Hauptseite?"
Richtig, da steht "wiki/". Oder genauer: "wiki" und "/".
Und das ist so ziemlich das ganze Geheimnis dahinter.
Es ist zwar jetzt Off-Topic, aber falls jemand weiß, wie man sowas wie in Wikipedia macht, wäre mein Problem eigentlich auch schon gelöst. Übrigens: Ich weiß, dass für spezielle Seiten (zum Beispiel zum Bearbeiten) bei Wikipedia eine "richtige" Adresse wie "/index.php" verwendet wird. Möglicherweise machen sie das auch mit 404, doch das konnte ich bisher nicht herausfinden.
Nein, auch das geht ohne 404, mit der gleichen Technik.
<textadventure>Benutze Google mit PATH_INFO</textadventure>.
Der Webserver zerlegt die URL bis /wiki und mappt diese URL auf ein Programm. Das kann ein CGI sein, ein PHP-Script, oder etwas völlig anderes. Aber der Webserver kennt es (aufgrund seiner Konfiguration) und weiss, dass alles, was auf /wiki folgt, nicht mehr für ihn, sondern für das Programm bestimmt ist. Dem Programm wird nun der Rest der URL in ein bis zwei Häppchen übermittelt, bei CGIs und PHP als PATH_INFO und QUERY_STRING, außerdem wird oft noch die komplette angeforderte URL mit übergeben (REQUEST_URI). Das Programm hat dann in aller Regel nichts besseres zu tun, als diese Daten weiter zu zerlegen, auf irgendeine Art und Weise (d.h. Datenbank-Abfrage) den passenden Inhalt zu finden, und ggf. noch hübsch in ein HTML-Grundgerüst (Template) verpackt wieder auszuliefern.
Zum Üben mal ein hoch eindrucksvolles Beispiel, als Perl-Programm. Packe es auf einen geeigneten Webserver so, dass es als /cgi-bin/hallo.cgi erreichbar ist, mache es mit chmod +x ausführbar, und rufe es mit verschiedenen URLs auf:
http://webserver/cgi-bin/hallo.cgi
http://webserver/cgi-bin/hallo.cgi/Peter
http://webserver/cgi-bin/hallo.cgi/Hans
http://webserver/cgi-bin/hallo.cgi/Franz/Meier
http://webserver/cgi-bin/hallo.cgi/Osterhase
use strict;
use warnings;
my $name=$ENV{'PATH_INFO'}||'Welt';
$name=~tr|/| |;
print "Content-Type: text/plain\r\n\r\nHallo $name!\n";
Keine Datei Peter, keine Datei Hans, keine Datei Franz/Meier, keine Datei Osterhase, und kein 404. Und trotzdem bekommst Du abhängig von der URL eine individuelle Begrüßung.
Auch Doppelpunkte funktionieren, wenn auch mit einer selten dämlichen Ausgabe: http://webserver/cgi-bin/hallo.cgi/Dop:pel:punk:te/sind/toll
Der Code hinter der Wikipedia ist "geringfügig" komplexer, aber er nutzt das gleiche Prinzip.
Übrigens wäre sogar der Prefix /wiki unnötig, man könnte gängige Webserver auch so konfigurieren, dass sie ALLE Requests an ein solches Programm weiterreichen. Das macht man aber deswegen nicht, weil Webserver in aller Regel statische Dateien wie Stylesheets, Javascripte und Bilder wesentlich effizienter ausliefern können als ein derart gestartetes Programm es könnte, und man läßt sich deswegen ein "Schlupfloch" mit einem anderen URL-Prefix, der auf ein ganz normales Verzeichnis gemappt ist. Dort werden Dateien dann stumpf aus dem Dateisystem ausgeliefert.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".