http请求的响应头同时设置了Date和Last-Modify字段,哪个优先级高?
比如我的Date 设置日期是 2023-01-01 ,
Last-Modify 是2023-05-01,
如果有效期是3个月,那我在2023-06-01 获取的资源是最新的吗?
http请求的响应头同时设置了Date和Last-Modify字段,哪个优先级高?
比如我的Date 设置日期是 2023-01-01 ,
Last-Modify 是2023-05-01,
如果有效期是3个月,那我在2023-06-01 获取的资源是最新的吗?
7 回答2.4k 阅读✓ 已解决
10 回答3k 阅读
2 回答2.3k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
至于优先级我认为这两个不应该进行比较
首先,根据https://httpwg.org/specs/rfc9111.html#response.cacheability来讨论什么样的响应应当被缓存,注意到Last-Modified不是成为缓存的必要头部。
其次,根据https://httpwg.org/specs/rfc9111.html#constructing.responses....来讨论什么时候从缓存构建响应。抛开Very头不说,资源是“新鲜的”就可以使用,那么就要参考https://httpwg.org/specs/rfc9111.html#expiration.model来讨论如何判断一个资源是否新鲜。这里会用到Date。另外,注意到max-age指令是高于Expired头,这两个是有优先级可比性的。
再次,如果缓存的资源不可用,或者不确定是否可用,就需要进行下一步验证,可以参考https://httpwg.org/specs/rfc9111.html#validation.model,通过Conditional Requests来确定使用哪一个已有缓存,或者更新缓存新鲜度,或者替换缓存。这个时候你会发现另外一种可比性,也就是验证条件的优先级,最准确的应该是etag配合If-match等;其次是Last-Modified配合If-modified-since;再次可能就是Last-Modified配合If-Range。然后根据响应决定是更新缓存新鲜度,还是用最新的资源替换缓存,这就涉及到200怎么办,304怎么办,要注意if-modified-since和if-unmodified-since这种相反的判断,if-match和if-none-match也是。
所以不难发现,Date和Last-Modified没有任何所谓优先级一说,前者可能用在评估资源新鲜度上,后者用于需要验证缓存的时候。Cache-Control不同,有可能Date完全用不上;而验证资源时也有可能用不上Last-Modified。
要说优先级,Cache-Control和其他用作缓存控制的头,比如Expired等可以进行比较;验证方面etag和last-modified都是可以作为条件请求的标的,在进行条件请求时如何选择合适的策略,他们之间是有优先级的比较的。
不过从流程上来看,通常情况下判断新鲜程度时,会先用到Date,然后在不新鲜时才会用到Last-Modifed做条件请求,这样看他们应该是先后顺序。在一定的场景下,他们也许都得用到,从而就更不存在所谓优先级了。