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.)
(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
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()