当 PUT 请求包含 If-Match header 时,Chrome 不会使缓存失效

Chrome does not invalidate cache when PUT request contains If-Match header

我正在创建一个 HTTP Web API,我的一些资源可以缓存在其中。可缓存资源将有两个操作,GET 和 PUT。 GET 将 return 响应 Cache-Control 的 header:public,max-age=3600 & Etag:“2kuSN7rMzfGcB2DKt67EqDWQELA”。 PUT 将需要 If-Match header,它将包含来自同一资源的 GET 的 Etag 值。我的目标是让浏览器缓存在我 PUT 到该资源时使该资源无效。这工作正常,直到我将 If-Match header 添加到 PUT 请求。当 PUT 请求包含 If-Match header 时,后续的 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

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

A cache MUST invalidate the effective Request URI... as well as the URI(s) in the Location and Content-Location response header fields (if present) when a non-error status code is received in response to an unsafe request method.

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