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

And*_*ndy 15 xmlhttprequest same-origin-policy cors

突然间,似乎没有改变我的网络应用程序中的任何内容,我在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标题.

在此输入图像描述

WTF?Chrome bug?

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

And*_*ndy 24

"凭证标志"是指XMLHttpRequest.withCredentials正在进行的请求,而不是Access-Control-Allow-Credentials标头. 这是我困惑的根源.

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


Alb*_*rto 9

Requests withCredentials:true,在配置了Access-Control-Allow-Origin: * CAN be used的服务器上,但你的服务器上需要一些额外的配置:

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

解决方法:

  1. 使服务器上的远程资源无需凭据即可访问(并使用xhr.withCredentials = false
  2. 在服务器上创建重写规则,将响应头修改 Access-Control-Allow-Origin=*为请求的来源。您还可以在特定条件下应用此重写,例如,如果请求使用特定端口或来自列入白名单的域列表。

这里有一些文章解释了如何在 IIS 服务器上执行此操作,但您可以在许多其他服务器上执行此操作:

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

PS2:“access-control-allow-origin”参数只允许 1 个值。如果您尝试使用例如两个域:domain1.com domain2.com,它将不起作用。