23

現狀:運行與我的靜態內容的default_expiration設置了谷歌App Engine的網站爲「14D」如何在WebKit中控制Google App Engine緩存行爲(etags瘋了)?

問題:在Chrome和Safari瀏覽器,訪問URL(重裝,只是把光標在地址欄並按Enter),會導致大量的請求被If-None-Match頭引發。如預期的那樣,響應總是304未修改。我可以看到這些請求被解僱,如Charles或Fiddler這樣的調試代理。

想要:爲了避免這些請求和304響應完全用於靜態內容 - 只需在瀏覽器緩存的內容可用時即可信任。

我們使用標準的「緩存靜態內容很長時間,當我們需要緩存緩存」系統時,我們會考慮在查詢字符串中添加?version = {version}修改,所以我們會真的很想避免304的。

信仰:我認爲這是由應用程序引擎發送的每個靜態內容響應引發的etag頭引起的。應用引擎SDK不會而不是向下發送此標頭,並且在與SDK無關時看不到此行爲。

有什麼建議嗎?你可以關閉應用程序引擎的靜態內容的etags嗎?

用一個例子一塊靜態內容更新:http://www.khanacademy.org/stylesheets/shared-package/compressed.css

+1

你可以發佈一個URL到上述靜態內容嗎?然後有人可以查看你要返回的標題(過期等)。 – 2010-12-10 18:08:16

+0

好主意,更新的問題 – kamens 2010-12-10 18:28:01

+0

不錯。我並不是專家,但我認爲答案就在那裏。我看到12月24日星期五,看起來不錯。我還看到一個Etag標頭,一個緩存控件和一個時代,這些可能會影響瀏覽器是否緩存內容。 – 2010-12-10 18:33:23

回答

8

雖然我不相信有任何方法可以控制GAE的etags標頭行爲,但這是由WebKit中的一個錯誤引起的,它導致所有靜態內容在POST後收到302重定向時被重新下載要求

一旦WebKit修復此錯誤,問題應該消失。

如果您需要,您可以通過重定向刷新標題而不是使用302重定向來臨時解決此特定的重定向POST錯誤。

https://bugs.webkit.org/show_bug.cgi?id=38690

WebKit image reload on Post/Redirect/Get

http://www.google.com/support/forum/p/Chrome/thread?tid=72bf3773f7e66d68&hl=en

3

的Chrome 9.0,Windows操作系統。加載您的主頁時,default.css以及所有其他.css文件都從緩存中提供,而不發出請求。我認爲這是一個瀏覽器特定的行爲,您還需要檢查其他瀏覽器。

此外,還要檢查這個谷歌的指示,他們幫了我很多,當調整緩存PARAMS: http://code.google.com/speed/page-speed/docs/caching.html

3

由於這是與Chrome和Safari瀏覽器的問題,你可以使用HTML5 App Cache,以防止對靜態資源服務器調用完全。查看一個示例here

2

嘗試查看當您沒有點擊「輸入」或刷新時是否發生同樣的事情,而只需點擊鏈接即可。在這種情況下,您的瀏覽器會做出不同的事如果不使用刷新或明確請求頁面,Safari尤其只會按照它們應該完成的方式執行請求。

您可以在Mac上簡單地嘗試一下。運行某些端口上的netcat的(NC)一個簡單的服務器,比方說9090:

nc -l 9090 

有一個鏈接到它http://localhost:9090創建一個簡單的頁面,單擊它,然後看你的頭NC命令顯示。

通過在nc中輸入響應手動返回響應,例如,類似

HTTP/1.0 200 OK 
ETag: "xyz" 
Content-type: text/plain 

Some text. 

再次單擊該鏈接並查看請求中的If-None-Match標頭。在地址欄中輸入地址後返回,您會看到Safari不會發送標題。

5

您需要刪除Last-Modified和ETag標頭。

通過刪除ETag標頭,可以禁用緩存和瀏覽器驗證文件,因此它們被迫依賴於Cache-Control和Expires標頭。 實體標籤(ETags)是一種檢查緩存文件的較新版本的機制。

刪除Last-Modified和ETag標頭,您將完全消除If-Modified-Since和If-None-Match請求及其304未修改響應,因此文件將保持緩存而不檢查更新,直到Expires標題表示新內容可用。

更多的信息在這裏:http://www.samaxes.com/2008/04/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/

不幸的是,我不知道如何關閉GAE的靜態內容。

3

您的ETag值很好。 ETag不強制重新驗證。它只是使它在上次修改日期後更可靠。我剛剛使用Chrome 9瀏覽了您的靜態內容示例,並且您的內容被緩存了,而且沒有不必要的重新驗證。 您看到的問題可能與「始終重新驗證」瀏覽器設置有關,這些設置對大多數瀏覽器都不是默認設置。它也可能是一個Mac webkit相關的錯誤。

相關問題