仅当有标头时,Chrome中的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)。 在谷歌浏览器中,它显示OPTIONS资源无法在网络检查器中加载,应用程序服务器未收到任何请求。 我试过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请求中的标头?

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

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

我发现只应为“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到我的本地服务器正常使用Post – Access-Control-Allow-Headers接受通配符。 这也是错的,通配符适用于我(我只测试过Chrome)

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

快乐的编码

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

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

 xhrFields: { withCredentials: true } 

更多细节在这里 。