2016-02-25 72 views
1

我有一個非常簡單的問題,我一直無法找到明確的答案。我有一個動態生成的網頁(所以我絕對不要想要它緩存),其中加載了數千個圖像。既然有這麼多的圖片,而且他們永遠不會改變,我很想肯定希望用戶的瀏覽器緩存這些圖片。強制HTML頁面上的no-cache也強制在圖像上禁止緩存?

我申請頭的HTML頁面,以防止緩存,請按照本解決方案的建議:How to control web page caching, across all browsers?

我的問題是:這會不會導致用戶的瀏覽器也不會緩存任何圖像該頁面包含,還是會緩存它們?謝謝。

+0

不,緩存是按每個資源管理的。 但是,如果您實際加載了數千張圖片,則可能會因爲大量圖片而導致緩存逐出。當然,這與緩存標題無關。 – Andrew

回答

1

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加載。 請求可以通過包含一個時間戳而使緩存不友好,而不涉及服務器。

這種方式可以配置緩存到處都,除了服務器,你要確保它無法通過單一製作的請求。