Относительные URL-адреса в AJAX-запросах


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

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, которые помогают преодолеть эту проблему?

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

2 32

2 ответа:

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

Именно так должны работать относительные пути.

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

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


Если вы укажете только новое имя файла "foo", вы получите тот же протокол, хост и dirs, только имя файла будет изменено:

родственник: foo

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


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

родственник: /dir3/filename2

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


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

родственник: //another.domain.name/dir5/filename3

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


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

protocol://some.domain.name/somename

Если" somename " - это каталог, то веб-сервер может перевести его в (возможно, с перенаправлением)

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


Обновить

Как Камерон сказал в комментарии: для справки см. Шаг 6 в разделе 4 RFC 1808

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

new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()