2011-01-22 5 views
31

Почему Javascript обрабатывает относительные URL-адреса по-другому, чем стандартный HTML? Подумайте о следующем URL-адресе (или просто просмотрите его): http://en.wikipedia.org/wiki/Rome. Открыть Firebug консоль (или другой консоли Javascript) и введите следующие данные:Относительные URL-адреса в запросах AJAX

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

Под моей системе посылается запрос «http://en.wikipedia.org/wiki/foo». «Рим» в URL-адресе просто игнорируется. Тот же запрос с конечной косой чертой в URL-адресе («http://en.wikipedia.org/wiki/Rome/») добавляет «foo» к полному URL-адресу.

Это, похоже, довольно сложно кодировать правильные URL-адреса в Javascript. Существуют ли библиотеки Javascript, которые помогают преодолеть эту проблему?

(я спросил похоже question раньше, но более JQuery конкретно, где это тоже бывает. Я надеюсь получить лучший ответ с этим несколькими более библиотечном самостоятельным вопросом.)

+0

@Zardoz Вы можете разместить ссылку на что другое аналогичный вопрос? –

+0

Конечно ... Я также отредактировал текст со ссылкой на этот вопрос: http://stackoverflow.com/questions/4754559/relative-url-does-not-get-resolved-correctly-by-jquery – Zardoz

+2

@ Zardoz Ссылки работают одинаково. Если URL-адрес страницы hxxp: //en.wikipedia.org/wiki/Rome, а на странице - этот якорь: '', тогда щелчок по ссылке откроет этот URL-адрес: hxxp: // ru.wikipedia.org/wiki/foo –

ответ

51

(обновлено, чтобы сделать его более удобным для чтения)

Вот как должны относиться относительные пути.

Притворись, что текущий адрес это:

Абсолютные:protocol://some.domain.name/dir1/dir2/filename


Если указать только новое имя файла «Foo», вы получите тот же протокол, хост и каталоги, только имя файла меняется:

Относительные:foo

Абсолютные:protocol://some.domain.name/dir1/dir2/foo


Если указать полный путь "/ dir3/filename2" вы получите тот же протокол и имя хоста, но с другим путем:

Relative:/dir3/filename2

Абсолютный:protocol://some.domain.name/dir3/filename2


Можно также указать имя хоста "//another.domain.name/dir5/filename3" и получить тот же протокол, но другой хост, реж и имя файла:

относительна://another.domain.name/dir5/filename3

Абсолютные:protocol://another.domain.name/dir5/filename3


что может ввести в заблуждение в том, что веб-сервер внутри может добавить/в конце, если т URL-адрес он указал url указывает на каталог, а не на файл.

protocol://some.domain.name/somename

Если "SomeName" является каталогом веб-сервер может перевести его на (возможно с переадресацией)

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


UPDATE

Как cameron сказал в комментарии: см. шаг 6 в секундах Тион 4 из RFC 1808

+2

См. Шаг 6 в разделе 4 раздела [RFC 1808] (http://www.ietf.org/rfc/rfc1808.txt) – Cameron

+0

@Cameron : Отлично! Добавил его к ответу. – some

0

Похож http://code.google.com/p/js-uri/ это библиотека выбора для манипулирования URL в целом, и этот типа абсолютных к относительным вычислениям, в частности:

new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString() 
Смежные вопросы