14

我正在尝试向使用会话密钥进行授权的外部应用程序服务器发送简单的 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 Resource 无法在 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 中都会出错,但在我上面提到的所有浏览器中都可以使用。

为什么谷歌浏览器不处理 CORS 请求中的标头?

4

4 回答 4

16

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

于 2013-01-27T19:51:15.153 回答
4

我发现 Access-Control-Allow-Headers: * 应该只为“OPTIONS”请求设置。如果您为 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 测试过)

这需要我半天时间才能弄清楚这个问题。

快乐编码

于 2013-06-15T15:46:26.637 回答
3

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

于 2013-01-27T17:20:40.617 回答
1

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

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

xhrFields: {
    withCredentials: true 
}

更多细节在这里

于 2013-01-25T10:04:25.543 回答