html-HTTP 304未修改响应是否应包含缓存控制标头?

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

runarM asked 2019-11-18T16:47:22Z
3个解决方案
46 votes

RFC7232将RFC2616更新为:

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

Mark Nottingham answered 2019-11-18T16:48:49Z
39 votes

从理论上讲,您不必发送304的Cache-Control -接收者仅应继续使用从原始200接收到的Cache指令。但是,正如您所发现的,实际上,如果您没有 继续发送Cache-Control,浏览器将忽略您最初发送的缓存指令,并恢复为它们自己的默认启发式。

因此,在实践中,您应该在304中包含与200相同的Cache-Control。规范仅要求您为304发送它与以前发送的内容不同(请参见10.3.5 304未修改)。 -但肯定不会禁止您重复相同的内容。

并专门针对其他答案(结构的)的错误观点作出回应:

  1. 您确实希望中间缓存缓存响应(即,为资源更新其缓存条目)。 它们将以200或304适当响应来自客户端的请求,具体取决于客户端是否包括条件标头(如If-Modified-Since)。

  2. 120秒的ttl将由304刷新(因此,相同的客户端至少要再等待120秒才应再次请求相同的资源)。 而且,只要客户端仍然缓存了内容,客户端将继续对资源进行有条件的请求,您可以继续使用304进行响应。

Justin Ludwig answered 2019-11-18T16:48:19Z
2 votes

如果我理解正确,那么浏览器实际上会缓存120秒,并且您的服务器对后续的If-Modified-Since请求响应304 Not Modified。 当最终用户访问相同的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秒后自动再次请求该文件。

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

Structure answered 2019-11-18T16:49:56Z
translate from https://stackoverflow.com:/questions/1587667/should-http-304-not-modified-responses-contain-cache-control-headers