简体   繁体   中英

Relative URLs in AJAX requests

Why does Javascript treat relative URLs differently than standard HTML? Think of the following URL (or just browse to it): http://en.wikipedia.org/wiki/Rome . Open a Firebug console (or another Javascript console) and enter the following:

var x = new XMLHttpRequest();
x.open("GET", "foo", true);
x.send("bar");

Under my system the request is sent to " http://en.wikipedia.org/wiki/foo ". The "Rome" in the URL is simply ignored. The same request with a trailing slash in the URL (" http://en.wikipedia.org/wiki/Rome/ ") appends the "foo" to the full URL.

This seems to make it pretty hard to encode the correct URLs in Javascript. Are there any Javascript libraries that help to overcome this problem?

(I asked a similiar question before, but more jQuery specific, where this also happens. I hope I get a better answer with this somewhat more library independent question.)

(updated to make it more readable)

This is how relative paths is supposed to work.

Pretend that the current address is this:

Absolute: protocol://some.domain.name/dir1/dir2/filename


If you specify only a new filename "foo", you get the same protocol, host and dirs, only the file name is changed:

Relative: foo

Absolute: protocol://some.domain.name/dir1/dir2/foo


If you specify a whole path "/dir3/filename2" you get the same protocol and hostname but with another path:

Relative: /dir3/filename2

Absolute: protocol://some.domain.name/dir3/filename2


You can also specify host name "//another.domain.name/dir5/filename3" and get the same protocol but another host, dir and filename:

Relative: //another.domain.name/dir5/filename3

Absolute: protocol://another.domain.name/dir5/filename3


What might be confusing is that a webserver internally can add a / at the end of the url if the specified url points to a directory and not to a file.

protocol://some.domain.name/somename

If "somename" is a directory the webserver might translate it to (possible with a redirect)

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


UPDATE

As cameron said in a comment: For reference, see step 6 in section 4 of RFC 1808

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM