2017-02-22 123 views
0

我用的是HTML meta標籤禁用緩存,直到我瞭解到,如果該文件是本地提供的這個唯一的作品,所以我通過把這個在我的網頁上禁用通過推薦使用標頭的緩存:禁用頁面緩存不會禁用資源緩存嗎?

header("Cache-Control: no-cache, no-store, must-revalidate"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

我無法找到答案,它可能是愚蠢的問,但是這並不會從緩存或者禁用資源,不是嗎?我在我的開發工具和看網絡選項卡,發現該網頁每次加載新鮮,但資源,如CSS和Javascript仍然從緩存中加載,這使我相信,防止頁面緩存不也意味着防止頁面資源被緩存,但我不知道這是否是真的。所以我所做的就是增加一些版本的資源,像這樣:

<link rel="stylesheet" href="css/style.css?version=1"> 

已停止被緩存,這就是我想要的東西,但資源,那麼閱讀多一些看來附加頭可用於後定位某些文件格式並阻止它們被緩存,這會產生與版本控制相同的結果,儘管方式不同。

難道我這是正確的和/或混合方法是不好的做法的理解?

+0

也許你正在緩存在Web服務器級別?在IIS中你有這個選項,幾乎肯定其他人 – Oscar

+2

for appache:http://httpd.apache.org/docs/current/mod/mod_expires.html – nogad

回答

1

你的觀察和理解是正確的。例如,當您在php中設置緩存標題時,它們僅對該頁有效。看着它從一個瀏覽器的點:

  • 請求頁面 - 收到迴應與說明不緩存它
  • 解析接收的頁面,獲取資源(CSS,JS,IMG等)
  • 的URI的
  • 發送請求這些資源 - 接收響應

如果在這最後的響應,沒有頭告訴瀏覽器不緩存他們,那麼他們將被按照標準規則緩存。

有不同的方法,以防止緩存。一個就是你描述的內容,即爲請求的URI添加一個不斷變化的參數 - 這樣,每次請求時,都會請求一個不同的參數。它仍然會被緩存,但下一個請求不會匹配這個緩存,並且不會使用緩存。

另一個涉及到改變你的web服務器的配置,以表明特定類型的資源(文件名,擴展名,內容類型等)不應該被緩存。例如,下面的Apache配置表示不緩存應該出現在所有的任何文件:

<Files *> 
    Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0" 
    Header set Expires: 0 
    Header set Pragma: no-cache 
</Files> 

請注意,高速緩存的想法是雙重的:

  • 使客戶能夠得到迴應通過使用資源
  • 降低服務器上的負載以前下載的本地副本更快具有服務於較少的反應

所以千萬要caref ul關閉緩存。如果您嚴重低估了您需要處理的請求數量,您可能(在極端情況下)最終會殺死您的服務器。

+0

謝謝你瀏覽器的POV,這讓我很清楚。我不知道爲什麼我認爲最初的指令不緩存會滲透到頁面中的所有內容,但現在我明白了! – Slime

+1

只是即使你這樣做,這些文件仍然可以緩存在不同的位置,如你的ISP。 – nogad

+0

@nogad正確。一些代理可能會忽略甚至剝離緩存標題。 –