it-roy-ru.com

Относительные 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, где это также происходит. Надеюсь, я получу лучший ответ на этот несколько более независимый от библиотеки вопрос.)

32
Zardoz

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

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

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

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


Если вы укажете только новое имя файла «foo», вы получите тот же протокол, Host и 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/


ОБНОВЛЕНИЕ

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

55
some

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

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