web-dev-qa-db-de.com

Relative URLs in AJAX Anfragen

Warum behandelt Javascript relative URLs anders als Standard-HTML? Denken Sie an die folgende URL (oder navigieren Sie einfach dazu): http://en.wikipedia.org/wiki/Rome . Öffnen Sie eine Firebug-Konsole (oder eine andere Javascript-Konsole) und geben Sie Folgendes ein:

var x = new XMLHttpRequest();
x.open("GET", "foo", true);
x.send("bar");

Unter meinem System wird die Anfrage an " http://en.wikipedia.org/wiki/foo " gesendet. Das "Rom" in der URL wird einfach ignoriert. Dieselbe Anfrage mit einem nachgestellten Schrägstrich in der URL (" http://en.wikipedia.org/wiki/Rome/ ") fügt das "foo" an die vollständige URL an.

Dies scheint es schwierig zu machen, die korrekten URLs in Javascript zu kodieren. Gibt es Javascript-Bibliotheken, die helfen, dieses Problem zu überwinden?

(Ich habe eine ähnliche Frage vorher gefragt, aber jQuery-spezifisch, wo dies auch geschieht. Ich hoffe, ich bekomme eine bessere Antwort mit dieser etwas bibliotheksunabhängigen Frage.)

32
Zardoz

(aktualisiert, um es lesbarer zu machen)

So sollen relative Pfade funktionieren.

Stellen Sie sich vor, dass die aktuelle Adresse so ist:

Absolut:protocol://some.domain.name/dir1/dir2/filename


Wenn Sie nur einen neuen Dateinamen "foo" angeben, erhalten Sie dasselbe Protokoll, Host und Verzeichnisse, nur der Dateiname wird geändert:

Relativ:foo

Absolut:protocol://some.domain.name/dir1/dir2/foo


Wenn Sie einen ganzen Pfad "/ dir3/filename2" angeben, erhalten Sie dasselbe Protokoll und denselben Hostnamen, jedoch einen anderen Pfad:

Relativ:/dir3/filename2

Absolut:protocol://some.domain.name/dir3/filename2


Sie können auch den Hostnamen "//another.domain.name/dir5/filename3" angeben und das gleiche Protokoll, aber einen anderen Host, ein Verzeichnis und einen Dateinamen abrufen:

Relativ://another.domain.name/dir5/filename3

Absolut:protocol://another.domain.name/dir5/filename3


Was verwirrend sein kann, ist, dass ein Webserver intern ein/am Ende der URL hinzufügen kann, wenn die angegebene URL auf ein Verzeichnis und nicht auf eine Datei verweist.

protocol://some.domain.name/somename

Wenn "somename" ein Verzeichnis ist, in das der Webserver es möglicherweise übersetzt, ist dies mit einer Umleitung möglich.

protocol://some.domain.name/somename/


UPDATE

Wie cameron sagte in einem Kommentar: Zur Referenz siehe Schritt 6 in Abschnitt 4 von RFC 1808

55
some

Sieht aus wie http://code.google.com/p/js-uri/ ist die Bibliothek der Wahl für die URL-Manipulation im Allgemeinen und diese Art der Absolut-zu-Relativ-Berechnung im Besonderen:

new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()
0
Partly Cloudy