H. aus G.: link parsen

Beitrag lesen

Hallo,

Und wer macht diese Auflösung? Der Browser vor dem Request? Vermutlich, denn eine vollständige URL zu requesten ist nur bei Benutzung eines Proxys üblich. Ansonsten sieht der Request ja (abgekürzt) so aus:

Um bei obigem Beispiel zu bleiben sieht mein Request wie folgt aus:

GET /board/././../board/./viewforum.php?f=2 HTTP/1.1
Host: www.ghisler.ch
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en
Connection: close

Dass ich hierbei die Domain, vom Rest trennen muss, hielt ich nicht für erwähnenswert, da ich dies als essenziell voraussetzte.

Der Teil nach dem GET fängt immer mit / an, denn relative Angaben kann ein Server nicht auflösen. er wüsste nicht von wo aus er starten soll. Deswegen war dein Beispiel "../123/./.././456/index.cgi?890" nichts für den Webserver, sondern muss erst noch vom Browser in die absolute Form gebracht werden.

Da gebe ich dir vollkommen recht, der Aufruf ist nur dann zielführend, wenn er aus einem Unterverzeichniss heraus gemacht wird und das Unterverzeichnis vor diesen String kopiert wird, mein Beispiel war nicht gut gewählt.

Nö, so einfach geht das nicht. Wenn die aktuelle Ressource die URL http://example.com/foo/bar hat und der Link "../qux" lautet, ergibt das Zusammenkopieren http://example.com/foo/bar../qux, was ja schon augenscheinlich nicht stimmt. Richtig wäre http://example.com/foo/qux

Auch hier hielt ich es nicht für erwähnenswert, dass der Dateiname der aktuellen Datei abgeschnitten werden muss, um danach den Link anzuhängen. Um bei deinem Beispiel zu bleiben, muss mal eben wissen ob "/bar" eine Datei oder ein Verzeichniss ist (kann man ja vorab über den Aufruf HEAD herausbekommen) ist es ein Verzeichniss sieht der GET Aufruf dann so aus:

/foo/bar/../qux

ist "bar" eine Datei so:

/foo/../qux

den Rest erledigt der Server, wenn /qux dann auch wieder ein Verzeichniss ist sieht der Aufruf, dann eben so aus:

/foo/../qux/

oder so

/foo/../qux/

Es emfiehlt sich eben zuerst den HEAD Aufruf duchzuführen, auszuwerten, und dann entsprechend den GET Aufruf zu tätigen.

Natürlich kann man nicht so lapidar sagen "Da sind nur die Strings hintereinander zu kopieren", aber verglichen mit dem Parsen von "./" und "../" und dem entsprechenden entfernen der Oberverzeichnisse, scheint es auf ein einfaches Kopieren von Strings mit minimaler Vorarbeit herauszulaufen.

Gruß Hans