当 PUT 请求包含 If-Match 标头时,Chrome 不会使缓存无效

时间:2021-04-09 18:32:27

标签: google-chrome http browser-cache cache-control

我正在创建一个 HTTP Web API,其中我的一些资源可以缓存。可缓存资源将有两个操作,GET 和 PUT。 GET 将返回 Cache-Control: public,max-age=3600 & Etag: "2kuSN7rMzfGcB2DKt67EqDWQELA" 的响应头。 PUT 将需要 If-Match 标头,该标头将包含来自相同资源的 GET 的 Etag 值。我的目标是在我 PUT 到该资源时让浏览器缓存使资源无效。这工作正常,直到我将 If-Match 标头添加到 PUT 请求。当 PUT 请求包含 If-Match 标头时,后续的 GET 请求将从缓存中获取过时数据。这是我在 Chrome 上遇到的行为。 Firefox 的行为并不像这样,并且按我的预期工作。这是 Chrome 中的错误还是我误解了 HTTP 规范的某些部分?

以下是一些显示行为的示例请求:

//correctly fetchs from origin server (returns 200)
GET http://localhost/api/my-number/1
  Response Headers
    cache-control: public,max-age=3600
    etag: "2kuSN7rMzfGcB2DKt67EqDWQELA"
  Response Body
    7

//correctly fetchs from disk cache (returns 200)
GET http://localhost/api/my-number/1
  Response Headers
    cache-control: public,max-age=3600
    etag: "2kuSN7rMzfGcB2DKt67EqDWQELA"
  Response Body
    7

//correctly updates origin server (returns 200)
PUT http://localhost/api/my-number/1
  Request Headers
    if-match: "2kuSN7rMzfGcB2DKt67EqDWQELA"
  Request Body
    8

//incorrectly still fetches from disk cache (returns 200)
GET http://localhost/api/my-number/1
  Response Headers
    cache-control: public,max-age=3600
    etag: "2kuSN7rMzfGcB2DKt67EqDWQELA"
  Response Body
    7

1 个答案:

答案 0 :(得分:3)

这确实是不正确的行为。 RFC 7234 说:

<块引用>

缓存必须使有效的请求 URI...以及 Location 和 Content-Location 中的 URI 无效 非错误状态代码时的响应头字段(如果存在) 响应不安全的请求方法而收到。

鉴于此,您提交的 bug report 看起来很适合我。