Я встречаюсь с запросами CORS, где мне нужно отправить if-none-match
. Я хочу данные кэша, которые в ответ имеют заголовок ETag в localStorage
с кодом 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
Response Headers:
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