首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >HTTP 304不应该修改-响应包含缓存控制报头吗?

HTTP 304不应该修改-响应包含缓存控制报头吗?
EN

Stack Overflow用户
提问于 2009-10-19 09:11:49
回答 2查看 24K关注 0票数 56

我试图理解这一点,并搜索了类似的问题,但我仍然不是100%理解这应该是如何工作的。

在对图像资源的请求中,我得到了以下响应:

代码语言:javascript
运行
复制
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响应:

代码语言:javascript
运行
复制
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-response中附加缓存控制标头?根据我在规范中读到的内容,似乎应该省略缓存控制设置,缓存应该自动缓存120秒?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-12-24 06:19:22

从理论上讲,您不应该为304发送Cache-Control --接收方应该继续使用它从原始200接收到的缓存指令。然而,正如你已经发现的,在实践中,如果你不继续发送Cache-Control,浏览器将忽略你最初发送的缓存指令,并恢复到它们自己的默认启发式。

因此在实践中,您应该在304中包含与200中相同的Cache-Control。该规范只要求在与之前发送的不同的情况下发送304 (参见10.3.5 304 Not Modified) --但它肯定不会禁止您在相同的情况下重复发送。

并具体回应其他答案(结构)中的错误观点:

  1. 您确实希望中间缓存缓存响应(即更新资源的缓存条目)。它们将适当地响应来自客户端的请求,使用200或304,这取决于客户端是否包含像If-Modified-Since.
  2. The 120这样的条件标头- 304将刷新ttl (因此,相同的客户端至少在120秒内不会对相同的资源发出另一个请求)。而且,只要客户端仍然缓存了内容,它们就会继续对资源进行有条件的请求,您可以继续使用304进行响应。
票数 41
EN

Stack Overflow用户

发布于 2010-12-09 07:45:43

RFC7232将RFC2616更新为:

生成304响应的服务器必须生成本应在200 (OK)响应中对同一请求发送的以下任何标头字段: Cache-Control、Content-Location、Date、ETag、Expires和Vary。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1587667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档