Access-Control-Allow-Origin:" *"凭证标志为true时不允许,但没有Access-Control-Allow-Credentials标头

时间:2015-12-04 00:08:11

标签: xmlhttprequest cors same-origin-policy

突然间,似乎没有在我的网络应用程序中更改任何内容,我在Chrome中打开它时开始出现CORS错误。我尝试添加Access-Control-Allow-Origin: *标头。然后我收到了这个错误:

XMLHttpRequest cannot load http://localhost:9091/sockjs-node/info?t= 1449187563637. A wildcard '*' cannot be used in the 'Access-Control-Allow-Origin' header when the credentials flag is true. Origin 'http://localhost:3010' is therefore not allowed access.

但正如您在下图所示,没有Access-Control-Allow-Credentials标题。

enter image description here

WTF? Chrome bug?

我的页面已加载到http://localhost:3010,该服务器也使用Access-Control-Allow-Origin: *而没有任何问题。如果两个端点都使用它会有问题吗?

3 个答案:

答案 0 :(得分:23)

“凭据标记”是指正在发出请求的XMLHttpRequest.withCredentials,而不是Access-Control-Allow-Credentials标题。这是我混淆的原因。

如果请求的withCredentialstrue,则即使没有Access-Control-Allow-Origin: *标头,也无法使用Access-Control-Allow-Credentials

答案 1 :(得分:3)

请求withCredentials:true,在配置了Access-Control-Allow-Origin: * 的服务器上可以使用,但您的服务器上还需要一些额外的配置:

在服务器上使用Access-Control-Allow-Origin=*,它将不允许在任何xhr CORS请求上访问任何资源(需要凭据)。

<强>解决方法:

  1. 无需凭据即可访问服务器上的远程资源 (并使用xhr.withCredentials = false
  2. 创建重写规则     服务器,修改响应头     Access-Control-Allow-Origin=*请求的来源。您可以     也可以在某些标准下应用此重写,例如,if     请求正在使用某个端口或来自列入白名单的列表     域。
  3. 以下是一些article that explains how to do this on a IIS server,但您可以在许多其他服务器中执行此操作:

    PS:如果使用凭据,您还需要服务器响应中的以下标头:Access-Control-Allow-Credentials=true

    PS2:“access-control-allow-origin”参数只允许1个值。如果您尝试使用两个域:domain1.com domain2.com,则无法使用。

答案 2 :(得分:1)

我使用这些步骤解决了同样的问题

1)禁用Chrome扩展程序“Allow-Control-Allow-Origin”

2)将这些添加到您的服务中

var xhr = new(); xhr.withCredentials = true;