我不知道这是http规范中的错误或功能,还是我不理解的事情。
我的资源最多每周更改一次,在本周开始。如果它没有改变,那么前一周的资源将在整个星期继续有效。
(对于我们所有的测试,我们已将一周时间修改为五分钟,但我认为我们的观察仍然有效。)
首先,我们使用标头Expires: next Monday
发送资源。浏览器从缓存中检索的整个星期。如果在星期一我们有一个新的资源,那么它将使用新的标题进行检索,一切正常。
未续订资源时出现问题。响应条件获取我们的应用程序(Java + Tomcat)发送带有Expires: next Monday
但没有正文的新标头。但我们的前端服务器(apache)删除了此标头,因为规范说如果资源没有更改,则不应发送新标头。所以现在永远(直到资源发生变化),当我们希望它继续直接从缓存中提供时,浏览器将发送条件获取。
是否有符合规范的方式更新标题而不更新正文? (或再次发送)
和subquestion:如何让apache传递给tomcat的头文件?
答案 0 :(得分:5)
只有一个Expires
标题是不够的。根据{{3}}第13.3.4节,服务器需要使用两个标头Last-Modified
和ETag
进行响应才能正确执行条件GET:
换句话说,HTTP / 1.1源服务器的首选行为是发送强实体标记和Last-Modified值。
如果客户端符合HTTP / 1.1,则应发送If-Modified-Since
。然后服务器应该响应如下(引自Roy Fielding的RFC 2616):
所以,我猜你不需要像你描述的那样配置Apache和/或Tomcat。您需要使您的应用程序符合HTTP / 1.1。
答案 1 :(得分:0)
答案 2 :(得分:0)
解决问题的一种方法是每周使用单独的URI。规范网址重定向到本周的相应网址,并指示浏览器将重定向缓存一周。此外,其中包含日期的URL将指示浏览器永久缓存。
规范网址:/ path / to / resource
Status Code : 301
Location : /path/to/resource/12-dec or /path/to/resource/19-dec
Expires : Next Monday
第1周:/ path / to / resource / 12-dec
Status code : 200
Expires : Never
第2周:/ path / to / resource / 19-dec
Status code : 200
Expires : Never
当缓存在星期一到期时,您只需发送重定向响应即可。您可以发送上周的网址或本周,但您永远不会发送整个回复正文。
通过这种方法,您已经消除了条件获取。您还获得了资源"不可修改 - 一旦发布",您还获得版本化资源。
唯一的警告 - 所有浏览器都没有重定向,即使http规范要求他们这样做。值得注意的是IE8及以下版本不会缓存。有关详细信息,请look at the column "cache browser redirects" in browserscope。
答案 3 :(得分:0)
{1}}标头基本上已弃用HTTP 1.1;请改用Expires
。
确保包含Cache-Control: max-age
。
它是可选的,但您可能还需要指定Last-Modified
,以确保中间代理不会提供可能过时的内容。
您无需设置Cache-Control: must-revalidate
。
示例请求:
ETag
回复包括请求的内容:
GET http://localhost/images/logo.png HTTP/1.1
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
Referer: http://localhost/default.aspx
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost
Connection: Keep-Alive
在10秒超时之前发出的请求从缓存中解析,没有HTTP请求。超时后:
HTTP/1.1 200 OK
Cache-Control: max-age=10
Content-Type: image/png
Last-Modified: Sat, 21 Feb 2009 11:28:18 GMT
Accept-Ranges: bytes
Date: Sun, 18 Dec 2011 05:48:34 GMT
Content-Length: 2245
响应只是标题,没有内容:
GET http://localhost/images/logo.png HTTP/1.1
Accept: image/png, image/svg+xml, image/*;q=0.8, */*;q=0.5
Referer: http://localhost/default.aspx
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
If-Modified-Since: Sat, 21 Feb 2009 11:28:18 GMT
Host: localhost
从浏览器的缓存中再次解析后续请求,直到指定的缓存到期时间为止。