HTTP 304 Not Modified-responses是否应该包含缓存控制头文件? [英] Should HTTP 304 Not Modified-responses contain cache-control headers?

查看:167
本文介绍了HTTP 304 Not Modified-responses是否应该包含缓存控制头文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图理解这一点,并且搜索了类似的问题,但我仍然没有百分之百的理解它应该如何工作。

 响应标题
服务器Apache-Coyote / 1.1
日期星期一,2009年10月19日09:04:04 GMT
过期周一,2009年10月19日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响应:

 响应标题
服务器Apache-Coyote / 1.1
日期2009年10月19日09:06:13 GMT

请求标题
主机localhost:8080
用户代理Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1.3)Gecko / 20090824 Firefox /3.5.3
接受图像/ png,图像/ *; q = 0.8,* / *; q = 0.5
Accept-Language zh-cn,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
连接保持活动
Referer http:// localhost:8080 / cms / site / 0 / en / home
Cookie JSESSIONID = 768ABBE1A3BFABE3B535900233330650 ; versionsCssDisplayState =块; iceInfo = iceOn:false,activePortletKey:,icePagePanelX:1722,icePagePanelY:3
If-None-Match image_a70703fb393a60b6da346c112715a0abd54a3236

到目前为止,一切顺利。但是,接下来的请求(在120秒内),我会认为资源应该缓存120秒。另一方面,我在浏览器(Firefox)中看到的是,它从此始终请求资源并收到304响应。



我是否应该在304响应中附加缓存控制标头?根据我在规范中可以读到的内容,似乎应该省略缓存控制设置,并且缓存应该自动缓存120秒。在理论上,你不应该为304发送缓存控制 - 接收者应该继续使用这个缓存。但是,正如你发现的那样,在实践中如果你不继续发送缓存控制,浏览器将忽略你最初发送的缓存指令,并恢复到它们自己的默认启发式。因此,在实践中,你应该包含与304相同的Cache-Control,你可以使用200.规范只是要求你发送一个304,如果它是与您以前发送的内容不同(请参阅 10.3.5 304未修改) - 但它肯定不会禁止你重复它,当它是相同的。



并专门针对其他错误点答案(结构的):


  1. do wa nt中间缓存来缓存响应(即,更新其资源的缓存条目)。他们会根据客户是否包含像If-Modified-Since这样的条件标题,对200或304客户的请求做出适当的响应。

  2. 120秒ttl 将被304刷新(所以同一个客户端不应该在另一个120秒内再次请求同一个资源)。而客户端,只要他们仍然拥有缓存的内容,继续对资源发出有条件的请求,您可以继续使用304响应。

    >


I've tried to understand this, and searched SO for similar questions, but I still don't have a 100% understanding on how this is supposed to work.

I get this response on a request for an image resource:

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

The desired behavior is that the client should cache this for 120 seconds, then request it from the server again. Within the 120 seconds, no request is sent to the server.

Then, after 120 seconds, a request is sent and a 304 response is received:

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

So far, all well. But then, on the next request (whithin 120 seconds) i would have thought that the resource should be cached for 120 new seconds. What i see in the browser (Firefox) on the other hand, is that it from this point on always request the resource and receives the 304-response.

Am I supposed to attach the cache-control headers in the 304-response? From what i can read in the spec, it seems like the cache-control settings should be omitted, and that the cache should cache it for 120 new seconds automatically?

解决方案

In theory you shouldn't have to send Cache-Control for a 304 -- the recipient should just continue to use the cache directives that it received from the original 200. However, as you've found, in practice if you don't keep sending Cache-Control, browsers will ignore the cache directives that you sent originally, and revert to their own default heuristics.

So in practice, you should include the same Cache-Control with a 304 that you would with a 200. The spec only mandates that you send it for a 304 if it's different than what you sent previously (see 10.3.5 304 Not Modified) -- but it certainly doesn't forbid you from repeating it when it's the same.

And to respond specifically to the wrong-headed points from the other answer (Structure's):

  1. You do want intermediary caches to cache the response (that is, update their cache entry for the resource). They will respond appropriately to requests from clients with a 200 or a 304, depending on whether the client included a conditional header like If-Modified-Since.

  2. The 120-second ttl will be refreshed by the 304 (so the same client shouldn't make another request for the same resource for at least another 120 seconds). And clients, as long as they've still got the content cached, will continue to make conditional requests for the resource, which you can continue to respond to with a 304.

这篇关于HTTP 304 Not Modified-responses是否应该包含缓存控制头文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆