簡體   English   中英

HTTP 304 Not Modified響應是否包含緩存控制頭?

[英]Should HTTP 304 Not Modified-responses contain cache-control headers?

我試圖理解這一點,並搜索SO以尋找類似的問題,但我仍然沒有100%理解它應該如何工作。

我對圖像資源的請求得到了這個響應:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:04:04 GMT
    Expires Mon, 19 Oct 2009 09:06:05 GMT
    Cache-Control   public, max-age=120
    Etag    image_a70703fb393a60b6da346c112715a0abd54a3236
    Content-Disposition inline;filename="binary-216-420"
    Content-Type    image/jpg;charset=UTF-8
    Content-Length  4719

所需的行為是客戶端應該緩存120秒,然后再次從服務器請求它。 在120秒內,沒有請求發送到服務器。

然后,在120秒后,發送請求並收到304響應:

Response Headers
    Server  Apache-Coyote/1.1
    Date    Mon, 19 Oct 2009 09:06:13 GMT

Request Headers
    Host    localhost:8080
    User-Agent  Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
    Accept  image/png,image/*;q=0.8,*/*;q=0.5
    Accept-Language en-us,no;q=0.8,sq;q=0.7,en;q=0.5,sv;q=0.3,nn;q=0.2
    Accept-Encoding gzip,deflate
    Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive  300
    Connection  keep-alive
    Referer http://localhost:8080/cms/site/0/en/home
    Cookie  JSESSIONID=768ABBE1A3BFABE3B535900233330650; versionsCssDisplayState=block; iceInfo=iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
    If-None-Match   image_a70703fb393a60b6da346c112715a0abd54a3236

到目前為止,一切順利。 但是,在下一個請求(在120秒內),我會認為該資源應緩存120秒。 另一方面,我在瀏覽器(Firefox)中看到的是,從這一點開始,它始終請求資源並接收304響應。

我應該在304響應中附加緩存控制頭嗎? 從我在規范中可以看到的內容,似乎應該省略緩存控制設置,並且緩存應該自動緩存120新的秒數?

RFC7232更新RFC2616說:

生成304響應的服務器必須生成以下任何一個頭字段,這些字段將在對同一請求的200(OK)響應中發送:Cache-Control,Content-Location,Date,ETag,Expires和Vary。

從理論上講,您不必為304發送Cache-Control - 收件人應該繼續使用從原始200收到的緩存指令。但是,正如您所發現的,在實踐中如果不這樣做繼續發送Cache-Control,瀏覽器將忽略您最初發送的緩存指令,並恢復為自己的默認啟發式。

因此,在實踐中,您應該使用與200一樣的304包含相同的Cache-Control。規范僅強制要求您發送304,如果它與您之前發送的不同(參見10.3.5 304未修改 ) - 但它肯定不會禁止你重復它,當它是相同的。

並從另一個答案(結構)中專門回答錯誤的觀點:

  1. 確實希望中間緩存緩存響應(即更新其資源的緩存條目)。 它們將對來自具有200或304的客戶端的請求作出適當的響應,具體取決於客戶端是否包含If-Modified-Since等條件頭。

  2. 304 刷新120秒的ttl(因此相同的客戶端不應再對另一個120秒的同一資源發出另一個請求)。 並且客戶端,只要他們仍然獲得緩存的內容, 繼續對資源進行條件請求,您可以繼續使用304響應。

如果我理解正確,那么瀏覽器實際上是緩存120秒,並且您的服務器正在響應304 Not Modified到后續的If-Modified-Since請求。 當最終用戶訪問相同的URL時,會發生此“IMS”請求。 那時瀏覽器可以發送If-Modified-Since請求。 瀏覽器想知道它是否顯示陳舊內容。 這似乎很正常。

收到此請求后,您的服務器應回復200 OK,304 Not Modified(或4XX,如有必要)。

我不相信您應該將服務器設置為使用304響應發送Cache-Control標頭,原因有兩個:
1.您不希望任何中間緩存緩存304響應(他們有可能)
2. 304響應不會刷新120秒TTL。 瀏覽器將從200 OK響應中保留對象120秒。 120秒后,瀏覽器發送GET請求,而不是If-Modified-Since,因此您的服務器將使用文件的字節進行響應,而不僅僅是304響應。

請注意,瀏覽器不會在120秒后自動再次請求文件,除非最終用戶通過頁面加載專門請求它或直接將URL輸入到他們的地址欄中(或者除非您有一個以某種方式控制該功能的自定義應用程序)。

編輯第一段讀得更好(希望如此)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM