AJAX请求中的相对URL

时间:2011-01-22 02:19:00

标签: javascript ajax url

为什么Javascript处理相对URL的方式与标准HTML不同?想想以下网址(或只是浏览它):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。

这似乎很难在Javascript中编码正确的URL。是否有任何Javascript库可以帮助解决这个问题?

(之前我问了一个类似的question,但更多的jQuery具体,这也发生了。我希望通过这个更多的独立于库的问题得到更好的答案。)

2 个答案:

答案 0 :(得分:55)

(更新以使其更具可读性)

这就是相对路径的工作方式。

假装当前地址是这样的:

绝对: protocol://some.domain.name/dir1/dir2/filename


如果只指定一个新文件名“foo”,则会获得相同的协议,主机和目录,只会更改文件名:

相对: foo

绝对: protocol://some.domain.name/dir1/dir2/foo


如果指定整个路径“/ dir3 / filename2”,则会获得相同的协议和主机名,但使用其他路径:

相对: /dir3/filename2

绝对: protocol://some.domain.name/dir3/filename2


您还可以指定主机名“//another.domain.name/dir5/filename3”并获得相同的协议,但另一个主机,目录和文件名:

相对: //another.domain.name/dir5/filename3

绝对: protocol://another.domain.name/dir5/filename3


可能令人困惑的是,如果指定的网址指向目录而不是文件,网络服务器内部可以在网址末尾添加/。

protocol://some.domain.name/somename

如果“somename”是一个目录,网络服务器可能会将其转换为(可能通过重定向)

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


<强>更新

正如cameron在评论中所述:有关参考,请参阅RFC 1808

第4部分中的第6步

答案 1 :(得分:0)

看起来http://code.google.com/p/js-uri/通常是URL操作的首选库,特别是这种类型的绝对相对计算:

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