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

fly*_*ire 4 java tomcat http apache2 http-headers

我不知道这是否是http规范中的错误或功能,或者我不理解正常的事情.

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

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

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

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

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

和subquestion:如何使apache传递tomcat的标头?

edw*_*rdw 5

只是一个Expires标题是不够的.根据RFC 2616第13.3.4节,服务器需要使用两个头响应,Last-Modified并且ETag要执行条件GET:

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

如果客户端符合HTTP/1.1,则应发送If-Modified-Since.然后服务器应该响应如下(引自Roy Fielding的添加条件GET提议):

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

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