资源修改后ETag更新

问题描述 投票:0回答:1

假设我有以下 2 个端点,它们获取并更新我的服务器上的资源:

获取/我的资源

放置/我的资源

我们现在希望通过使用

ETag
标头来实现浏览器缓存,以最大程度地减少服务器上的负载。

让我们假设以下流程

  1. 用户获取/myResource。我的服务器计算当前资源的
    ETag
    ,并将其返回给客户端。例如,该值为 $eTag1
  2. 用户更新/myResource。我的服务器计算更新资源的新
    ETag
    。例如,$eTag2

问题

当用户再次尝试获取 /myResource 时,浏览器会使用资源更新后的 ETag 值(即 $eTag2),还是会坚持旧的 ETag 值(即 $eTag1)?

我担心浏览器可能会将 GET /myResource 和 PUT /myResource 视为两个不同的资源。因此,使用 PUT 请求更新资源不会更新内部浏览器缓存。

http browser-cache cache-control etag
1个回答
0
投票
简短版本:以这种方式更新资源可以正常工作。

长版本:您将两个独立的事物混为一谈:缓存和条件验证。

您可以使用

Cache-Control 标头控制 缓存(请参阅 RFC 9111

),该标头确定缓存可以为资源提供服务的时间。在这个“新鲜度生命周期”期间,缓存将在不检查源服务器的情况下提供资源。 
ETag 无关紧要。
资源不再新鲜后,如果存在
ETag

标头,缓存可以向源服务器发出

条件请求

(请参阅
RFC 9110),这样只有在资源存在时才会返回完整响应已经改变了。 所以这里有两个问题。首先,在资源新鲜时发送PUT

是否会导致缓存失效?

`:“因为不安全的请求方法...有可能改变源服务器上的状态,所以需要干预缓存来使存储的响应无效,以保持其内容最新。”下一个请求将由源服务器处理。
其次,向源服务器发送 PUT

是否会导致结果

ETag

 发生变化,从而导致后续条件请求将导致返回新资源?是的,这是条件请求如何工作的基础。
	

© www.soinside.com 2019 - 2024. All rights reserved.