TL; DR答案不明確,因爲它是複雜。
有一個驅動器做了「正確」的事情之間存在長期鬥爭(即遵循其本身已經改變了標準......)和「改進」的標準,以達到更好的性能驅動器或更平滑的用戶導航體驗。因此,從應用程序的角度來看,您需要正確使用諸如ETag,If-Modified-Since和Expires之類的標題以及緩存提示編譯指示,但瀏覽器(或代理中間的某些內容)可能仍然決定覆蓋什麼是「明確的事情」。
在最新的Firefox上,直接連接到虛擬Ubuntu機器上的Apache 2.4,我嘗試了一個涉及圖像(test.jpg)的頁面(test.html)。
當頁面被緩存時,服務器端我看到一個單一的HTML請求和圖像的任何內容。可能發生的情況是,Firefox的「渲染」部分確實要求映像(它必須!),但這完全由本地緩存提供。這是有道理的;如果頁面沒有改變,它的內容沒有改變。
當頁面是而不是緩存時,我看到兩個請求,一個用於頁面,另一個用於圖像,服務器用304響應,但這是因爲我還發送圖像的Last-Modified標頭。這也是有道理的 - 如果頁面發生了變化,圖像可能也發生了變化,所以瀏覽器必須知道是否是這種情況,並且只能通過詢問服務器來實現(除非Expires標頭用於「向客戶保證「圖片將不是更改)。
我還沒有嘗試過使用304響應的未緩存頁面。我期望它會生成一個請求(對服務器沒有圖像請求),原因相同。
你可能想要考慮的是,你不會緩存HTML頁面,但可能仍然執行一千個圖像請求(這將產生一千個304的,但是仍然是)。這類事件的性能取決於請求是通過使用Keep-Alive HTTP/1.1擴展(必須啓用並通告服務器端)獨立發送還是背對背發送。
然後,您應該使用圖像上的Expires標題告訴客戶端,這些資源將而不是不久後會過時。
你可能或許也是想探索一種不同的方法:
- 的HTML緩存
- 圖像緩存太
- 的HTML還引用一個Javascript
- 變量的內容(緩存?)由Javascript通過AJAX加載。 請求可以通過包含一個時間戳而使緩存不友好,而不涉及服務器。
這種方式可以配置緩存到處都,除了服務器,你要確保它無法通過單一製作的請求。
不,緩存是按每個資源管理的。 但是,如果您實際加載了數千張圖片,則可能會因爲大量圖片而導致緩存逐出。當然,這與緩存標題無關。 – Andrew