http:条件获取没有机会刷新标题而不再发送正文

时间:2011-12-08 10:27:22

标签: java http tomcat apache2 http-headers

我不知道这是http规范中的错误或功能,还是我不理解的事情。

我的资源最多每周更改一次,在本周开始。如果它没有改变,那么前一周的资源将在整个星期继续有效。

(对于我们所有的测试,我们已将一周时间修改为五分钟,但我认为我们的观察仍然有效。)

首先,我们使用标头Expires: next Monday发送资源。浏览器从缓存中检索的整个星期。如果在星期一我们有一个新的资源,那么它将使用新的标题进行检索,一切正常。

未续订资源时出现问题。响应条件获取我们的应用程序(Java + Tomcat)发送带有Expires: next Monday但没有正文的新标头。但我们的前端服务器(apache)删除了此标头,因为规范说如果资源没有更改,则不应发送新标头。所以现在永远(直到资源发生变化),当我们希望它继续直接从缓存中提供时,浏览器将发送条件获取。

是否有符合规范的方式更新标题而不更新正文? (或再次发送)

和subquestion:如何让apache传递给tomcat的头文件?

4 个答案:

答案 0 :(得分:5)

只有一个Expires标题是不够的。根据{{​​3}}第13.3.4节,服务器需要使用两个标头Last-ModifiedETag进行响应才能正确执行条件GET:

  

换句话说,HTTP / 1.1源服务器的首选行为是发送强实体标记和Last-Modified值。

如果客户端符合HTTP / 1.1,则应发送If-Modified-Since。然后服务器应该响应如下(引自Roy Fielding的RFC 2616):

  • 如果资源无法访问(无论出于何种原因),那么服务器应该像现在一样返回4XX消息。
  • 如果资源不再存在,服务器应返回404 Not Found响应(即与现在相同)。
  • 如果资源可访问但其最后修改日期早于(小于)或等于传递的日期,则服务器应返回304 Not Modified消息(没有正文)。
  • 如果资源可以访问且其最后修改日期晚于通过的日期,则服务器应返回带有正文的200 OK消息(即与现在相同)。

所以,我猜你不需要像你描述的那样配置Apache和/或Tomcat。您需要使您的应用程序符合HTTP / 1.1。

答案 1 :(得分:0)

尝试为HTTP-Date标题发送有效的Expires

答案 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

从浏览器的缓存中再次解析后续请求,直到指定的缓存到期时间为止。