2012-05-14 56 views
2

我正在研究一個解決方案來加速我們的網站。我在客戶端首先AJAX負載應用程序的預期的下一個頁面:Safari將URL#片段整合到其瀏覽器緩存中

$.ajax({url: '/some/real/path', ...}); 

服務器響應此並且包括在報頭中:

Cache-Control => 'max-age=20' 

這標誌着響應爲是可緩存的。

客戶端應用程序然後等待查看它的預測是否正確,並在發現它是,它將瀏覽器轉換到同一頁面,但將一些信息作爲#片段添加到URL中,其中此信息是提供給我們,只有當用戶實際已經承諾他們的動作(即不可預測):

location.href = '/some/real/path#additionalInfoInFragement'; 

當瀏覽器過渡到片段中的其他信息是由頁面的JavaScript拿起和頁面努力實現那裏有一些效果。

對於所有瀏覽器,包括Safari,響應於起始AJAX請求被適當地插入到瀏覽器高速緩存中。

然後,對於除Safari瀏覽器所有瀏覽器,瀏覽器就會將該內容從緩存中,當我們實現放在location.href過渡到該頁面。這可以避免服務器受到攻擊,並且是我們加速的基礎。

Safari瀏覽器,雖然沒有使用高速緩存來重新服務於內容。它似乎被轉換的'#additionalInfoInFragment'部分絆倒了。它在構造緩存鍵時使用它來檢查現有的緩存內容。下面是從Safari的cache.db文件中的條目,這是我通過源碼甩:

* ajax request: INSERT INTO "cfurl_cache_response" VALUES(3260,0,-1982644086,0,'http://localhost:8080/TomcatScratchPad/EmptyPage','2012-05-14 07:01:10'); 

* location.href transition: INSERT INTO "cfurl_cache_response" VALUES(3276,0,-230554366,0,'http://localhost:8080/TomcatScratchPad/EmptyPage#wtf','2012-05-14 07:01:20'); 

另外值得注意的是,Chrome的正常運作,即使兩個份額的代碼的WebKit了大量的事實。

我非常感謝社會上有任何想法。謝謝!

+0

我可以說:哇,你真的深入瞭解這一點。好一個。 –

回答

1

我只看到一對夫婦的選擇:與蘋果

  1. 發送錯誤報告,不要擔心。 :-)您的緩存內容仍然適用於其他瀏覽器。總的來說,Safari有very small market share,當然如果你的網站是針對(比如說)iPad或iPhone用戶,那麼它會改變你的特定網站的統計數據的性質。 :-)(你可能從你的日誌知道你的Safari瀏覽器的觀衆有多大。)

    子類別:如果Safari是你的目標市場的一個重要組成部分,這使你感到困擾,看它是否是一個錯誤在任何它的開源部分,如果有的話,提供補丁。

  2. 不要使用片段標識符來傳遞信息,而不是用其他的東西(也許是一個cookie)。