如果HTTP 304未修改,响应包含缓存控制头?(Should HTTP 304 Not Modif

2019-08-20 07:07发布

我试图理解这一点,所以搜索类似的问题,但我还没有上,这是如何工作的一个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

到目前为止,一切安好。 但随后,在下一个请求(whithin 120秒)我本来以为这些资源应该缓存120新秒钟。 我在另一方面浏览器(Firefox)的发现,也就是从这个角度上总是请求资源,并接收了304响应。

我应该附上缓存控制标头在304响应? 从我可以在spec读,好像缓存控制设置应该被忽略,并且缓存应该缓存它为120个新秒钟后自动?

Answer 1:

从理论上说,你不应该发送的Cache-Control为304 - 收件人应该只是继续,如果你不使用它从原来的200接收。然而,因为你已经找到了缓存指令,在实践中继续发送缓存控制,浏览器会忽略你最初发送的缓存指令,并恢复到自己的默认启发。

因此,在实际操作中,应包括相同的Cache-Control有304,你会用200只规范您发送它的304,如果它比你送什么以前不同的任务(见10.3.5 304未修改 ) - 但它肯定不会重复它时,它是相同的不许你。

并专门应对来自对方的回答错了双头点(结构的):

  1. 想中介缓存到缓存响应(即,更新资源的缓存条目)。 他们将作出适当反应有200或304,这取决于客户端是否包括条件标题一样的If-Modified-由于来自客户端的请求。

  2. 120秒TTL 将由 304被刷新(所以相同的客户端不应该使另一个请求针对同一资源至少另一个120秒)。 和客户端,只要他们仍然得到了缓存的内容, 继续对资源,你可以继续用一个304响应条件请求。



Answer 2:

RFC7232更新RFC2616地说:

服务器产生304响应必须产生任何会在200(OK)响应于相同的请求被发送下面的头字段:缓存控制,内容位置,日期,ETag的,过期,和变化。



Answer 3:

如果我理解正确,则浏览器实际上是在缓存120秒,你的服务器响应304未修改后续的If-Modified-Since请求。 当最终用户访问同一个URL时发生此“IMS”请求。 当时的浏览器可以发送一个If-Modified-Since请求。 浏览器想知道,如果它显示陈旧的内容。 这似乎是正常的。

在接收到该请求的服务器应该回复200 OK,304未修改(或4XX,如果必要的话)。

我不相信你应该设置你的服务器发送一个Cache-Control头有两个原因304响应:
1.你不希望任何中介缓存来缓存304响应(还有一种可能性,即他们可以)
2.120秒TTL不会被304响应被刷新。 该浏览器将保留120秒钟将对象从200 OK响应。 120秒后的浏览器应该发送一个GET请求,而不是一个If-Modified-Since,而是让你的服务器将用字节的文件,而不仅仅是一个304响应响应。

需要注意的是,浏览器就不会再自动后120秒请求文件,除非终端用户通过一个页面加载特别要求或直接输入网址进入他们的地址栏(或者,除非你有某种方式控制该功能的自定义应用程序)。

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



文章来源: Should HTTP 304 Not Modified-responses contain cache-control headers?