Chrome 不缓存预检
Chrome not caching preflight
我正在实施一个应该支持跨域请求的 REST API。我想使用 CORS 来实现这一目标。我的几乎所有请求都是 'not-simple',这意味着对于所有非 GET 请求,浏览器都必须发送预检请求。
为了限制 preflight/OPTIONS 请求的数量,我尝试让浏览器缓存 OPTIONS 请求。这似乎在 Firefox 和 Safari 中有效,但在 Chrome 中无效。我知道 Chrome 只会将预检请求缓存 10 分钟,但在我的情况下似乎根本没有缓存。
这些是 sent/received Chrome 的 HTTP 请求和响应:
要求:
OPTIONS /api/v1/sessions HTTP/1.1
Host: xxxxxxx
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:8000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
回复:
HTTP/1.1 200 OK
Date: Sun, 26 Jul 2015 09:33:27 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Cache-Control: private, max-age=1440, pre-check=1440
Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Methods: GET,POST,PATCH,DELETE
Access-Control-Max-Age: 86400
Access-Control-Allow-Headers: content-type
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
您在请求中设置了 Pragma: no-cache
& Cache-Control: no-cache
headers。
尝试删除它们。
Api 请求默认不设置这些 headers,我怀疑 chrome 是否设置
要么。
你应该检查你的代码并找出它们在哪里
设置自。
现在,鉴于它在其他浏览器上工作正常,你最好检查一下你是否在 Dev Tools
上设置了 no-cache
选项。
预检缓存是 98 版本中的一个已知错误。
关注下方小票了解更多详情
https://bugs.chromium.org/p/chromium/issues/detail?id=1298477
我正在实施一个应该支持跨域请求的 REST API。我想使用 CORS 来实现这一目标。我的几乎所有请求都是 'not-simple',这意味着对于所有非 GET 请求,浏览器都必须发送预检请求。
为了限制 preflight/OPTIONS 请求的数量,我尝试让浏览器缓存 OPTIONS 请求。这似乎在 Firefox 和 Safari 中有效,但在 Chrome 中无效。我知道 Chrome 只会将预检请求缓存 10 分钟,但在我的情况下似乎根本没有缓存。
这些是 sent/received Chrome 的 HTTP 请求和响应:
要求:
OPTIONS /api/v1/sessions HTTP/1.1
Host: xxxxxxx
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: POST
Origin: http://localhost:8000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36
Access-Control-Request-Headers: content-type
Accept: */*
Referer: http://localhost:8000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
回复:
HTTP/1.1 200 OK
Date: Sun, 26 Jul 2015 09:33:27 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Cache-Control: private, max-age=1440, pre-check=1440
Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Methods: GET,POST,PATCH,DELETE
Access-Control-Max-Age: 86400
Access-Control-Allow-Headers: content-type
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
您在请求中设置了 Pragma: no-cache
& Cache-Control: no-cache
headers。
尝试删除它们。
Api 请求默认不设置这些 headers,我怀疑 chrome 是否设置
要么。
你应该检查你的代码并找出它们在哪里
设置自。
现在,鉴于它在其他浏览器上工作正常,你最好检查一下你是否在 Dev Tools
上设置了 no-cache
选项。
预检缓存是 98 版本中的一个已知错误。 关注下方小票了解更多详情
https://bugs.chromium.org/p/chromium/issues/detail?id=1298477