假设我有以下 2 个端点,它们获取并更新我的服务器上的资源:
获取/我的资源
放置/我的资源
我们现在希望通过使用
ETag
标头来实现浏览器缓存,以最大程度地减少服务器上的负载。
让我们假设以下流程
ETag
,并将其返回给客户端。例如,该值为 $eTag1ETag
。例如,$eTag2当用户再次尝试获取 /myResource 时,浏览器会使用资源更新后的 ETag 值(即 $eTag2),还是会坚持旧的 ETag 值(即 $eTag1)?
我担心浏览器可能会将 GET /myResource 和 PUT /myResource 视为两个不同的资源。因此,使用 PUT 请求更新资源不会更新内部浏览器缓存。
长版本:您将两个独立的事物混为一谈:缓存和条件验证。
您可以使用
Cache-Control
标头控制 缓存(请参阅 RFC 9111
),该标头确定缓存可以为资源提供服务的时间。在这个“新鲜度生命周期”期间,缓存将在不检查源服务器的情况下提供资源。
ETag
无关紧要。
资源不再新鲜后,如果存在
ETag
标头,缓存可以向源服务器发出条件请求
(请参阅RFC 9110),这样只有在资源存在时才会返回完整响应已经改变了。 所以这里有两个问题。首先,在资源新鲜时发送
PUT
是否会导致缓存失效? 是
`:“因为不安全的请求方法...有可能改变源服务器上的状态,所以需要干预缓存来使存储的响应无效,以保持其内容最新。”下一个请求将由源服务器处理。其次,向源服务器发送
PUT
是否会导致结果 ETag
发生变化,从而导致后续条件请求将导致返回新资源?是的,这是条件请求如何工作的基础。