仅当有标头时,Chrome中的CORS请求才会失败

时间:2013-01-24 02:00:27

标签: jquery ajax google-chrome http-headers cors

我正在尝试向使用会话密钥进行授权的外部应用程序服务器发送简单的CORS请求。

$.ajax({
    type: "GET",
    url: "https://192.168.1.72:8442/api/file/",
    headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"}
});

它在Firefox 18,Opera 12.12和Rekonq 2.0(也使用WebKit)中运行良好,但在Google Chrome中无效(尝试过版本21和24)。在Google Chrome中,它显示OPTIONS资源无法在Network Inspector中加载,并且应用程序服务器未收到任何请求。我已经尝试过jQuery 1.8.3和1.9.0。

Request URL:https://192.168.1.72:8442/api/file/
Request Headers
Access-Control-Request-Headers:accept, authorization, origin
Access-Control-Request-Method:GET
Cache-Control:no-cache
Origin:https://192.168.1.72:8480
Pragma:no-cache

如果我从请求中删除标题,那么我也会在Google Chrome中收到401,并且在应用服务器上禁用授权的情况下,它可以访问该资源。发送哪个标头无关紧要。我只能发送的标题是{“Content-Type”:“plain / text”}。所有其他标题名称/值都会在Google Chrome中出错,但适用于我上面提到的所有浏览器。

为什么Google Chrome无法处理CORS请求中的标头?

4 个答案:

答案 0 :(得分:16)

这是Google Chrome中的一个错误:http://code.google.com/p/chromium/issues/detail?id=96007

答案 1 :(得分:3)

我在我的api服务器上使用自签名证书,这似乎是个问题。我发现如果我使用--disable-web-security选项启动Google Chrome,则带有请求标头的CORS正在运行。没有--disable-web-security我可以向自签名api服务器发送CORS请求,但无法添加任何标头(Content-Type除外)。

答案 2 :(得分:3)

我发现只应为“OPTIONS”请求设置Access-Control-Allow-Headers:*。 如果您将其返回POST请求,则浏览器会取消请求(至少对于chrome)

以下PHP代码适用于我

// Allow CORS
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');    
header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 

// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  header("Access-Control-Allow-Headers: *");
}

我发现了类似的问题和一些误导性的反应: - 服务器线程说这是2年的chrome错误:Access-Control-Allow-Headers与localhost不匹配。这是错的:我可以正常使用CORS到我的本地服务器 - Access-Control-Allow-Headers接受通配符。这也是错的,通配符适用于我(我只测试过Chrome)

我花了半天的时间来弄清楚这个问题。

快乐编码

答案 3 :(得分:1)

服务器端: 服务器应设置标题“Access-Control-Allow-Credentials”,并在“Access-Control-Allow-Headers”中设置允许的标题。

客户端:您可以在$ .ajax()中设置xhrFields,而不是显式传递Auth标头。

xhrFields: {
    withCredentials: true 
}

更多详情here