我试图理解这一点,并搜索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新的秒数?
解决方法
从理论上讲,您不必为304发送Cache-Control – 收件人应该继续使用从原始200收到的缓存指令.但是,正如您所发现的,在实践中如果不这样做继续发送Cache-Control,浏览器将忽略您最初发送的缓存指令,并恢复为自己的默认启发式.
所以在实践中,你应该使用与200一样的304包含相同的Cache-Control.规范只强制你发送它为304,如果它与你之前发送的不同(见10.3.5 304 Not Modified) – 但它肯定当它是相同的时候,不会禁止你重复它.
并从另一个答案(结构)专门回应错误的观点:
>您确实希望中间缓存缓存响应(即更新其资源的缓存条目).它们将适当地响应来自具有200或304的客户端的请求,具体取决于客户端是否包括If-Modified-Since等条件头.> 304将刷新120秒的ttl(因此同一客户端不应再对另一个120秒的同一资源发出另一个请求).并且客户端,只要他们仍然获得缓存的内容,将继续对资源进行条件请求,您可以继续使用304响应.