轉自:https://blog.csdn.net/itpinpai/article/details/48181849
大家好,今天給大家分享一個狀態碼304,大家可能在以前的開發中打開chrome tools 或 firebug工具時有意間或無意間看到它。
HTTP 304: Not Modified
標准解釋是:Not Modified 客戶端有緩沖的文檔並發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務器告訴客戶,原來緩沖的文檔還可以繼續使用。
如下圖:
在請求頭里有:If-Modified-Since: Mon, 17 Aug 2015 01:53:41 GMT
在響應頭里有:Last-Modified: Mon, 17 Aug 2015 01:53:41 GMT
大家對比一下這二個日期發日期和時分秒都是完全一致的,如果一致就從緩存中去獲取內容
我們在圖片中看到了一個它cache-control
如果cache-control:no-chache說明強制每次請求直接發送給源服務器,而不經過本地緩存版本的校驗。
如果cache-control:max-age=0有二種情況:
1、max-age>0 時 直接從游覽器緩存中 提取
2、max-age<=0 時 向server 發送http 請求確認 ,該資源是否有修改有的話 返回200 ,無的話 返回304.
第一次訪問 200
鼠標點擊二次訪問 (Cache)
按F5刷新 304
按Ctrl+F5強制刷新 200
===========================================================================================
轉自:https://blog.csdn.net/canot/article/details/76359917
最近研究nginx日志的時候,對於304這個狀態碼產生了好奇。之前一直知道3XX系列的狀態碼表示重定向,但對於304的具體原理沒有仔細研究過。
304 的標准解釋是:客戶端有緩沖的文檔並發出了一個條件性的請求。服務器告訴客戶端,原來緩沖的文檔還可以繼續使用。
完成這個幾個動作包括服務器確認返回304給予客戶端,主要包含幾個http頭信息,請求頭If-None-Match、響應頭ETag和響應頭Cache-Control
為了更好的理解304狀態碼以及緩存,直接實驗一把:
為了方便就使用express啟動一個服務了(express幾行代碼就搞定了)
var express = require('express');
var app = express();
app.get('/', function(req, res) {
res.send('hello world');
});
app.listen('8080')
啟動之后,瀏覽器訪問localhost:8080並觀察請求,響應頭。
第一次請求:
第二次請求:
第二次請求服務器返回了一個304。
在第一次請求服務器的時候在獲取資源之后是會先把該資源緩存在本地的,同時服務器response返回了一個響應頭ETag,ETag全稱Entity Tag,用來標識一個資源。在具體的實現中,ETag可以是資源的hash值,也可以是一個內部維護的版本號。但不管怎樣,ETag應該能反映出資源內容的變化,這是Http緩存可以正常工作的基礎。服務器對於hello world這個字符串使用上述返回的ETag來表示,只要hello world這個資源不變,這個Etag就不會變。
客戶端第二次請求服務器的時候,利用請求頭If-None-Match來告訴服務器自己已經有個ETag為xxx的資源。如果服務器上的資源沒有變化,也就是說服務器上的資源的ETag也是xxx的話,服務器就不會再返回該資源的內容,而是返回一個304的響應,告訴瀏覽器該資源沒有變化,緩存有效,瀏覽器將直接調用本地緩存。
響應頭Cache-Control
每個資源都可以通過Http頭Cache-Control來定義自己的緩存策略,Cache-Control控制誰在什么條件下可以緩存響應以及可以緩存多久。 最快的請求是不必與服務器進行通信的請求:通過響應的本地副本,我們可以避免所有的網絡延遲以及數據傳輸的數據成本。為此,HTTP 規范允許服務器返回一系列不同的 Cache-Control 指令,控制瀏覽器或者其他中繼緩存如何緩存某個響應以及緩存多長時間。
Cache-Control 頭在 HTTP/1.1 規范中定義,取代了之前用來定義響應緩存策略的頭(例如 Expires)。當前的所有瀏覽器都支持 Cache-Control,因此,使用它就夠了。
以下我來介紹可以再Cache-Control中設置的常用指令。
max-age
該指令指定從當前請求開始,允許獲取的響應被重用的最長時間(單位為秒。例如:Cache-Control:max-age=60表示響應可以再緩存和重用 60 秒。需要注意的是,在max-age指定的時間之內,瀏覽器不會向服務器發送任何請求,包括驗證緩存是否有效的請求,也就是說,如果在這段時間之內,服務器上的資源發生了變化,那么瀏覽器將不能得到通知,而使用老版本的資源。所以在設置緩存時間的長度時,需要慎重。
public和private
如果設置了public,表示該響應可以再瀏覽器或者任何中繼的Web代理中緩存,public是默認值,即Cache-Control:max-age=60等同於Cache-Control:public, max-age=60。
在服務器設置了private比如Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應,不允許任何中繼Web代理對其進行緩存 - 例如,用戶瀏覽器可以緩存包含用戶私人信息的 HTML 網頁,但是 CDN 不能緩存。
no-cache
如果服務器在響應中設置了no-cache即Cache-Control:no-cache,那么瀏覽器在使用緩存的資源之前,必須先與服務器確認返回的響應是否被更改,如果資源未被更改,可以避免下載。這個驗證之前的響應是否被修改,就是通過上面介紹的請求頭If-None-match和響應頭ETag來實現的。
需要注意的是,no-cache這個名字有一點誤導。設置了no-cache之后,並不是說瀏覽器就不再緩存數據,只是瀏覽器在使用緩存數據時,需要先確認一下數據是否還跟服務器保持一致。如果設置了no-cache,而ETag的實現沒有反應出資源的變化,那就會導致瀏覽器的緩存數據一直得不到更新的情況。
no-store
如果服務器在響應中設置了no-store即Cache-Control:no-store,那么瀏覽器和任何中繼的Web代理,都不會存儲這次相應的數據。當下次請求該資源時,瀏覽器只能重新請求服務器,重新從服務器讀取資源。