gpt4 book ai didi

java - http:条件获取不会在不再次发送正文的情况下刷新 header

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:26 24 4
gpt4 key购买 nike

我不知道这是 bug 还是 HTTP 规范中的一个特性,或者我不理解事情。

我有一个资源每周最多更改一次,在一周的开始。如果没有变化,则前一周的资源在整周内继续有效。

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

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

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

是否有一种符合规范的方式来更新 header 而不更新正文? (或重新发送)

还有子问题:如何让 apache 传递 tomcat 的 header ?

最佳答案

只有 Expires header 是不够的。根据RFC 2616 13.3.4 节,服务器需要响应两个 header ,Last-ModifiedETag,以正确执行条件 GET:

In other words, the preferred behavior for an HTTP/1.1 origin server is to send both a strong entity tag and a Last-Modified value.

如果客户端符合 HTTP/1.1,它应该发送 If-Modified-Since。然后服务器应该响应如下(引用自 Roy Fielding 的 proposal to add conditional GET ):

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

所以,我想您不需要按照您描述的方式配置 Apache 和/或 Tomcat。您需要使您的应用程序符合 HTTP/1.1 标准。

关于java - http:条件获取不会在不再次发送正文的情况下刷新 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8429499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com