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
Looks like http://code.google.com/p/js-uri/ is the library of choice for URL manipulation in general and this type of absolute-to-relative computation in particular:
new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString()
(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