HTTP 304 Not Modified响应是否包含缓存控制头?

时间:2009-10-19 09:11:49

标签: html http-headers etag

我试图理解这一点,并搜索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新的秒数?

3 个答案:

答案 0 :(得分:46)

RFC7232更新RFC2616说:

  

生成304响应的服务器必须生成任何一个      以下将在200(OK)中发送的标题字段      响应相同的请求:缓存控制,内容位置,日期,      ETag,Expires和Vary。

答案 1 :(得分:39)

理论上你不应该为304发送Cache-Control - 收件人应该继续使用从原始200收到的缓存指令。但是,正如你所发现的那样,在实践中如果你如果不继续发送Cache-Control,浏览器将忽略您最初发送的缓存指令,并恢复为自己的默认启发式。

所以在实际操作中,你应该使用与200一样的304包含相同的Cache-Control。规范只要求你发送一个304,如果它与你之前发送的不同(参见{{3}) }) - 但它肯定不会禁止你在它相同时重复它。

并从另一个答案(结构)中专门回答错误的观点:

  1. 希望中间缓存缓存响应(即更新其资源的缓存条目)。他们将对来自200或304的客户端的请求做出适当的响应,具体取决于客户端是否包含If-Modified-Since等条件头。

  2. 304将刷新120秒的ttl 继续对资源进行条件请求,您可以继续使用304进行响应。

答案 2 :(得分:2)

如果我理解正确,那么浏览器实际上是缓存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响应。

请注意,除非最终用户通过页面加载明确请求或直接将URL输入其地址栏,否则浏览器将不会在120秒后自动再次请求文件(或者除非您有自定义应用程序来控制该功能以某种方式)。

编辑第一段以便更好地阅读(希望如此)