我有一台服务器,它公开了一些资源,并发送回以下标头:
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
之所以需要这样做,是因为服务器包含静态资源,这些资源可以通过我们Intranet上的各种Web应用程序和开发环境进行访问,而这些资源都是不同的来源。
直到最近,它一直可以正常工作,但是现在停止了。现在,如果我们尝试从任何来源访问任何资源,则会收到错误消息:
Failed to load http://foo/bar/res: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. Origin 'http://devenv06:4589' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute
因此,我尝试手动添加我的起源,如下所示:
Access-Control-Allow-Origin: http://devenv01,http://devenv02,http://prodserver
Access-Control-Allow-Credentials: true
但是现在我收到错误:
Failed to load http://foo/bar/res: The 'Access-Control-Allow-Origin' header contains multiple values, but only one is allowed
这基本上使服务器无法使用,因为我需要多个来源。
所以,我想知道的是:
答案 0 :(得分:1)
这是浏览器引入的新东西,还是服务器上发生了变化?
这不是规范中的新要求。
是否有一个通用的解决方案,而不必手动设置每个可能的来源?
编写逻辑,该逻辑读取Origin
request 标头,然后使用该值生成Access-Control-Allow-Origin
response 标头。
通常,您通常需要先将其传递给白名单,否则,您将授予evil-hacker.example.com
的权限,以便使用登录到您网站的用户的浏览器向服务器发出请求,并提供所有必要的凭据来证明他们就是他们所说的。那可能是一个巨大的安全性问题,并且一开始就没有凭据。