2017-02-14 7 views
0

Я встречаюсь с запросами 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 

ответ

1

При добавлении заголовка в If-None-Match запрос на запрос, он запускает браузеры сначала сделать CORS preflight OPTIONS request, а сервер вы что запрос, по-видимому, пока еще не настроен для надлежащего обращения с запросом OPTIONS.

Чтобы избежать необходимости просмотра браузером этого OPTIONS запроса, вы можете захотеть рассмотреть вопрос о необходимости кэширования другим способом, который не требует отправки заголовка запроса If-None-Match.

 Смежные вопросы

  • Нет связанных вопросов^_^