当 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 看起来适合我。
我正在创建一个 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 看起来适合我。