我遇到了CORS请求的问题,我需要发送if-none-match
头文件。我想要缓存数据,如果服务器将响应,则在localStorage
中使用ETag代码,并在下一次使用缓存数据时使用ETag头文件304
如果ETag
是实际的,则为状态。角例如:
let cachedItem = dataCache.get(url);
if (cachedItem) {
config.headers['If-None-Match'] = cachedItem.headers['etag'];
}
$http.get(url, config)
.success(function(data, status, headers) {
if (headers('ETag')) {
dataCache.put(url, {
data,
headers: headers()
});
}
...
})
但在Chrome,Firefox的这个请求响应405
状态和错误Response for preflight has invalid HTTP status code 405
。这只发生在我添加If-None-Match
时,否则它会返回正确的响应。我不知道它为什么,因为在响应标题存在Access-Control-Allow-Headers: if-none-match
,也Access-Control-Allow-Origin: *
。
请求报头:
OPTIONS ... HTTP/1.1
Host: ...
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Access-Control-Request-Method: GET
Origin: http://localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Access-Control-Request-Headers: if-none-match
Accept: */*
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
X-Compress: null
响应头:
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: Link, ETag
Access-Control-Allow-Headers: if-none-match
Date: Tue, 14 Feb 2017 16:09:39 GMT
Content-Length: 76