瀏覽器記憶體是否需要 Last-Modified HTTP 標頭?
當我
Last-Modified
在 Apache 中取消設置標頭(ETags
也被禁用)時,Firefox(4.01)將不會記憶體任何文件,無論我是否設置了未來Expires
的標頭或啟用Cache-Control
標頭。那麼瀏覽器記憶體是否需要
Last-Modified
(和/或)標頭?ETag
從這裡:
如果響應中沒有驗證器(ETag 或 Last-Modified 標頭),並且它沒有任何明確的新鮮度資訊,則它將被視為不可記憶體。
…好吧,如果“新鮮度資訊”是指“Cache-Control”或“Expires”標頭,則 Firefox 應該在沒有 Last-Modified 標頭的情況下進行記憶體。
編輯更多 Firefox 資訊
請注意,在沒有標頭的情況下,在 Firefox 4.01 中由 Apache 2.2 提供的任何 PHP 文件的嘗試都不會成功(重新載入、新訪問等)
Last-Modified
,無論是否設置了有效記憶體Cache-Control
標頭、Expires
標頭或兩者的任何組合標題。
foo.php
:這個文件的內容只是簡單地回顯“Hello World”。HTTP/1.1 200 OK Date: Mon, 06 Jun 2011 14:04:58 GMT Server: Apache Cache-Control: public, max-age=3600 Expires: Fri, 01 Jul 2011 21:23:55 GMT Vary: Accept-Encoding Content-Encoding: gzip Content-Length: 1594 Keep-Alive: timeout=10, max=500 Connection: Keep-Alive Content-Type: text/html; charset=utf-8
編輯更奇怪的 Firefox 4.01 發現
更奇怪的是,根據我在 Firefox 4.01 中看到的情況,沒有任何形式的伺服器端記憶體控制標頭(Expires 和/或 Cache-Control)會影響 Firefox 的記憶體行為。Firefox 只關心新鮮度資訊(Etag 或 Last-Modified)。
總之,如果文件已被修改,Firefox 會重新載入它,而不考慮任何 Expires 或 Cache-Control 標頭。如果文件不包含任何新鮮度資訊,Firefox 無論如何都會重新載入它。
如果有人在他們的觀察中發現不同,請更新我。
另一個編輯
從這個連結:
13.2.1 伺服器指定的過期時間
過期時間不能用於強制使用者代理刷新其顯示或重新載入資源;它的語義只適用於記憶體機制,並且這種機制只需要在發起對該資源的新請求時檢查資源的過期狀態。請參閱第 13.13 節了解記憶體和歷史機制之間的區別。
小心閱讀網路上的隨機文章(儘管 Mark Nottingham 的文章通常是明智的)。最終來源應始終由 RFC 提供。並且根據RFC 2616,瀏覽器應該記憶體帶有 Expires: 標頭的文件,其中時間戳在未來,或者提供其他有效的記憶體指令,前提是該文件沒有響應 POST 請求而返回。
在沒有 last-modified 的情況下設置 max-age 是完全有效的——並且規范明確地解決了這個問題。
當然,您所描述的似乎很不尋常,並暗示 FF4.01 將永遠不會記憶體內容——我會很驚訝它通過了 QC 檢查,卻有如此明顯的遺漏。您能否提供證明這一點的請求和響應的詳細資訊(例如使用liveheaders)?