2011-01-22 42 views
31

爲什麼Javascript將相對URL與標準HTML不同?想想下面的URL(或只是瀏覽它):http://en.wikipedia.org/wiki/Rome。 打開Firebug的控制檯(或其他JavaScript控制檯),並輸入以下內容:AJAX請求中的相對URL

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具體的,在這裏也會發生這種情況。我希望我能有這個有點多庫獨立的問題,更好的答案。)

+0

@Zardoz您可以發佈鏈接到其他類似的問題? – 2011-01-22 02:23:46

+0

當然......我也編輯了一個鏈接到這個問題文本:http://stackoverflow.com/questions/4754559/relative-url-does-not-get-resolved-correctly-by-jquery – Zardoz 2011-01-22 02:28:16

回答

51

(更新,使其更具可讀性)

這是相對路徑應該如何工作。

假裝當前的地址是:

絕對:protocol://some.domain.name/dir1/dir2/filename


如果只指定一個新的文件名「富」,你會得到相同的協議,主機和顯示目錄,只文件名改爲:

相對:foo

絕對:protocol://some.domain.name/dir1/dir2/foo


如果指定一個完整路徑 「/ DIR3 /文件名2」,你會得到相同的協議和主機名,但與另​​一條路徑:

相對:/dir3/filename2

絕對值:protocol://some.domain.name/dir3/filename2


您還可以指定主機名 「//another.domain.name/dir5/filename3」 並獲得相同的協議,但另一臺主機,目錄和文件名:

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

絕對:protocol://another.domain.name/dir5/filename3


可能是什麼困惑的是,Web服務器內部可以在URL如果T的末尾添加/他指定了url指向一個目錄而不是一個文件。

​​

如果 「somename」 是目錄的Web服務器可能會(與重定向可能的)翻譯成

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


UPDATE

正如cameron說在評論中:作爲參考,請參見第6步的RFC 1808

0

重刑4貌似http://code.google.com/p/js-uri/是首選一般URL處理庫,特別是這種類型的絕對到相對計算:

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