2010-02-17 20 views
4

我越來越怪異的404錯誤在我的網站的以下網址:爲什麼Firefox在JavaScript代碼中從IMG src請求僞造的URL?

GET /%27%20+%20item.icon%20+%20%27 HTTP/1.1 

我在我的HTML文件中得到了一些相應的代碼:

<script type="text/javascript"> 
    function foo(item) { 
    return '<img src="' + item.icon + '">' : ''; 
    } 
</script> 

似乎是從Firefox 3.5的到來/3.6在Windows上,但我不能保證。

那麼,爲什麼FF會請求這個URL呢?它試圖預加載圖像或其他東西?有關如何阻止它的任何建議?

+0

tbhis您的網站的代碼來自? –

+0

檢查可能導致解析器將腳本視爲html的拼寫錯誤。你能發佈鏈接嗎? – Amarghosh

+0

不幸的是,你必須登錄到網站才能發送代碼。我通過jslint運行腳本,我很確定代碼沒有問題。它運行良好,並且在我測試過的任何瀏覽器中沒有得到任何錯誤。 – Tom

回答

6

Firefox正在將您的代碼解釋爲XHTML。嘗試把你的代碼在這樣的CDATA部分:

<script type="text/javascript"> 
//<![CDATA[ 
    function foo(item) { 
    return '<img src="' + item.icon + '">' : ''; 
    } 
//]]> 
</script> 

有關此問題的一點點更多信息,請this page

+0

非常煩人重現,似乎需要退出FireFox,刷新和Ctrl + F5不會導致問題,只有第一次加載的頁面。 – Tom

+0

這可能與瀏覽器緩存有關。 Firefox已經知道除了從該URL返回的404錯誤之外沒有其他任何東西,並且不打算再次嘗試。重新啓動Firefox會清空該緩存。 –

+0

我得到該網頁無效(X)的HTML。然而,我的Firefox(3.5.7-ubuntu)仍然將它解析成你所期望的(在'script'元素中沒有'img'元素)。 LiveHTTPHeaders不會顯示虛假的'img'請求。我很困惑爲什麼普通標籤湯啓發式算法不適用於此。解析器的這一部分是否在3.6中改變了? Tom,在DOM Inspector或Firebug中DOM看起來像什麼? –

1

好吧,原來使用CDATA部分畢竟沒有幫助。通過將函數移動到單獨的.js腳本文件來修復它。

2

我有這個確切的同樣的問題。

我可以確認它是從Mac FF 3.6發生的。這是一個3.6的東西。據IRC上的一些人士說,即使是3.7個alpha版本似乎也能工作,我已經嘗試過了。

我也可以確認CDATA技巧不起作用;我嘗試了很多變化。我也試過不同的DOCTYPES等。

我也有一個可怕的時間再現它。它只發生在我載入頁面的時間的30%左右,即使我每次用w/r/t清除緩存,重新啓動FF等都採取相同的步驟。這絕對是一個heisenbug。我無法提出一個簡單的測試用例。觸發這種情況的條件必須非常複雜。

但是,我在修復它方面有一些運氣。關鍵似乎是要殺掉src=。因此,例如:

var someHTML = '<img src="' + item.url + '" />'; 

變爲:

var someHTML = '<img s'+'rc="' + item.url + '" />'; 

到目前爲止,這似乎是幫助,但一直沒有足夠長的時間,我可以肯定。

這個問題在我的情況下特別隱晦;我有一個JSON字符串,其中包含20個URL,FF 3.6在瞬間請求所有20個URL(這些URL是假的URL,但最終打到同一頁面),而每當有人用FF 3.6訪問我的網站時,DoS就是服務器。

這是FF中的一個非常糟糕的錯誤。我認爲很多網站管理員還沒有發現它正在發生,但我想象它會造成廣泛的問題。

+0

好主意打破'src'屬性。正如我在我的回答中所提到的那樣,將代碼移出到一個單獨的'.js'文件中也有訣竅。 – Tom

+0

確認此解決方案有效。難以置信。我也有FF/Win請求在HTML註釋中的''內出現的破壞性URL(不太常見;還沒有提出一個好的解決方案)。 –

+0

此外,另一個可行的解決方案是在JS字符串中將「src =」更改爲「s \ u0072c =」。 –