2009-04-30 56 views
4

繼Steve(YSlow)Souder的傳福音後,我的網站(LibraryThing.com)跨域分割請求以促進並行加載。我們做CSS,JS和圖片;你也可以做Flash等。我們也使用Google的Prototype版本,它是跨域的,不僅僅是跨子域。跨領域拆分請求 - 阻止過度安全

這對速度來說都很棒,但對於一小部分用戶來說,這是錯誤的。我認爲問題是過度安全的設置,可能在IE中,但也可能在其他瀏覽器和/或上游系統中。我很驚訝Souders和其他人不會討論這個,因爲我們知道了很多。

問題是:處理這個問題的最好方法是什麼?

現在,當它打到頁面的底部時,我們正在檢查是否設置了在應該加載的腳本中聲明的某個JS變量。如果沒有設置,它會從主域獲取它並設置一個cookie,以便下次不會從子域加載它。但是我們只是在底部重新加載JS,所以如果CSS也失敗了,那麼你就看着垃圾。

有沒有人有更好或更廣義的解決方案?我在想,可能會有一個通用的「onload」或「onerror」腳本來設置cookie並加載內容?

+0

你可以發佈一些代碼嗎?你是否在做所有的客戶端? – 2009-04-30 09:05:00

+0

這只是一個客戶端問題 - 我的網站可以去獲取任何東西:)。 我認爲這個問題已經足夠普遍,發佈代碼只是混淆了這個問題,但我們現在正在這樣做。如果JS var沒有設置,請在本地獲取並設置cookie。 <腳本類型= 「文本/ JavaScript的」> 如果(typeof運算EXPIREDATE == 「未定義」)//變種沒有設置 \t { \t文件撰寫(「 LibraryThingTim 2009-04-30 09:16:28

回答

0

您是否有具有此行爲的特定用戶代理列表? 也許Apache conf可以解決這個問題? (或者爲你創建一個新問題來解決:-))。

注意cookie狂熱 - 您添加的cookie越多(此外,在主域上),您的客戶越需要將其發送到請求中。

Souders也談到了這一點,但它總是很好的檢查你的客戶端瀏覽器發送/接收比率的請求。

+0

>用戶代理 不,我認爲我們在IE中使用安全設置之前就複製了它。我假設它是一個安全問題。一些非常嚴格的設置假定頁面不應該從其域外部獲取 - 最重要的是JS,而且還包括CSS。哎呀,你可以設置你的瀏覽器不要從外面取圖像,以防你真的偏執狂。 >餅乾 這是非常真實的。事實上,正如Souders所建議的那樣,這是使用輔助域的一個原因 - 從無cookie的域中獲取所有靜態內容。 – LibraryThingTim 2009-04-30 09:52:50

0

我打算對你的問題進行一些猜測。

緩存。您是否在腳本文件中進行了這些更改,這些問題用戶可能擁有舊版本。 IE 6對過度的緩存非常不利。我注意到你的腳本在url中沒有build#,XYZ.js?version = 3會強制瀏覽器不使用像XYZ.ks?version = 2這樣的舊緩存腳本。 (也適用於圖像/ Css)

您還將內嵌JavaScript與您的HTML混合,這也將被緩存。

3個領域可能是矯枉過正,除非你的網站有關於它的內容的TON(大頁面)

DNS查找可能是昂貴的,並有很長的超時值。

因爲可能存在安全衝突,我不會很樂意將我的網站JavaScript放在單獨的域上。你必須保持你的javascript/ajax調用與域同步。似乎更像是一件麻煩事,而不是它的價值。

我一直在使用i.domain.com和domain.com 5年以上沒有問題。

我敢打賭把JS放回主域可以解決你的問題。這肯定會使它不那麼複雜和容易處理。

但做得很好,你的3個域名應該可以工作。不幸的是,我沒有足夠的信息來解決這個問題。

1

如果這個行爲總是影響JS文件,至少有一個選擇是保留一個cookie,指出用戶的瀏覽器是否已經被測試過這種行爲。如果它們尚未經過測試,請插入(作爲標記中的第一個腳本元素)對跨域腳本的引用,該腳本將此cookie簡單設置爲「成功」。然後立即有一些內聯JS檢查這個cookie,如果沒有設置,設置爲「失敗」並重新加載頁面。

然後在服務器端檢查相同的cookie,並確保跨站點請求不會發送給任何具有「失敗」結果的人。

此方法應確保具有支持跨站點請求的瀏覽器的用戶看不到任何異常行爲,但應該立即以其自身刷新爲代價解決問題,以便在首次訪問時自動刷新。