Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Абсолют: 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


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

protocol://some.domain.name/somename

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

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


UPDATE

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

Ответ 2

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

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