AJAX 请求中的相对 URL

IT技术 javascript ajax url
2021-02-21 07:46:31

为什么 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 中的“Rome”被简单地忽略了。在 URL(“ http://en.wikipedia.org/wiki/Rome/ ”)中带有斜杠的相同请求将“foo”附加到完整 URL。

这似乎使得在 Javascript 中编码正确的 URL 变得非常困难。是否有任何 Javascript 库可以帮助克服这个问题?

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

2个回答

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

这就是相对路径应该如何工作。

假设当前地址是这样的:

绝对: 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


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

protocol://some.domain.name/somename

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

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


更新

正如卡梅伦在评论中所说:供参考,请参阅RFC 1808第 4 节中的步骤 6

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

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