2017-02-14 49 views
0

我遇到了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 

回答

1

当你If-None-Match请求头添加到请求,它触发浏览器首先做一个CORS preflight OPTIONS request,而你的服务器使请求显然不(但)配置为正确处理该请求。

为避免浏览器需要发送该请求,您可能需要考虑以另一种方式处理缓存需求,而无需发送If-None-Match请求标头。