应该HTTP 304未修改响应包含caching控制标头?

我试图理解这一点,并search了类似的问题,但我仍然没有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 

所需的行为是客户端应caching120秒,然后再从服务器请求。 在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秒),我会认为资源应该caching120秒。 另一方面,我在浏览器(Firefox)中看到的是,它始终请求资源并收到304响应。

我应该在304-响应中附加caching控制标题? 从我可以在规范中看到,似乎应该省略caching控制设置,并且caching应该自动caching120秒。

从理论上说,你不应该为304发送caching控制 – 接收者应该继续使用从原来的200接收到的caching指令。但是,正如你发现的,在实践中,如果你不继续发送caching控制,浏览器将忽略您最初发送的caching指令,并恢复到它们自己的默认启发式。

所以在实践中,你应该包含一个与你使用一个200的同样的Cache-Control。这个规范只要求你发送一个304,如果它不同于你以前发送的(见10.3.5 304 Not Modified ) – 但它当然不禁止你重复它,当它是相同的。

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

  1. 确实需要中间caching来caching响应(即更新其资源的caching条目)。 他们会根据客户是否包含如If-Modified-Since这样的条件头来适当地响应来自200或304客户的请求。

  2. 120秒ttl 被304刷新(所以同一个客户端不应该对另外的请求至less另外120秒)。 而客户端,只要他们仍然有内容caching, 继续作出有条件的请求资源,你可以继续回应与304。

RFC7232更新RFC2616说:

生成一个304响应的服务器务必产生下面的任何一个头域,这些头域是在一个200(OK)的响应中发送给同一个请求的:Cache-Control,Content-Location,Date,ETag,Expires和Vary。

如果我理解正确,那么浏览器实际上caching了120秒,并且您的服务器正在响应304未修改为后续的If-Modified-Since请求。 这个“IMS”请求在最终用户访问相同的URL时发生。 那时浏览器可以发送If-Modified-Since请求。 浏览器想知道它是否显示陈旧的内容。 这似乎很正常。

收到这个请求后,你的服务器应该回复200 OK,304 Not Modified(或者4XX,如果需要的话)。

我不相信你应该设置你的服务器发送一个带有304响应的Cache-Control头,原因有两个:
1.您不希望任何中间cachingcaching304响应(有可能)
2. 120秒的TTL不会被304响应刷新。 浏览器将从200 OK响应中保留该对象120秒。 120秒后,浏览器应该发送一个GET请求,而不是一个If-Modified-Since,所以你的服务器将以文件的字节进行响应,而不仅仅是一个304响应。

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

编辑第一段阅读更好一点(希望)