【问题标题】:Reason for 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' error响应中“Access-Control-Allow-Origin”标头的原因不能是通配符“*”错误
【发布时间】:2019-01-16 16:57:35
【问题描述】:

我有一个公开一些资源的服务器,并发送回以下标头:

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

这是必需的,因为服务器包含静态资源,这些资源可以被我们整个 Intranet 中的各种 webapps 和开发环境访问,它们都是不同的来源。

这直到最近才正常工作,但现在停止了。现在,如果我们尝试从任何来源访问任何资源,我们会收到错误消息:

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

这基本上使服务器无法使用,因为我需要多个来源。

所以,我想知道的是:

  • 这是浏览器引入的新功能,还是服务器上发生了一些变化?为什么它以前使用该配置可以工作,而现在却不行? (客户端代码没有改变...)
  • 是否有一个通用的解决方案,而不必手动设置每个可能的原点?

【问题讨论】:

标签: cors


【解决方案1】:

这是浏览器引入的新东西,还是在服务器上发生了一些变化?

这不是规范中的新要求。

是否有一个通用的解决方案,而不必手动设置每个可能的原点?

编写读取Origin请求标头的逻辑,然后使用该值生成Access-Control-Allow-Origin响应标头。

通常您会希望首先通过白名单传递它,否则,您将授予 evil-hacker.example.com 从登录您网站的人的浏览器向您的服务器发出请求的权限,并提供证明他们是所需的所有凭据他们说他们是谁。这可能是一个巨大的安全问题,并且首先让凭据变得毫无意义。

【讨论】:

  • 很遗憾,服务器软件不是我们开发的,它是第三方产品,我可以在设置中设置自定义响应头,但不能像您建议的那样动态设置。我猜他们在最近的版本中引入了这个限制,此时我将不得不联系他们以获得支持。谢谢。
  • (我没有标记你的答案,因为我注意到我的解决方法实际上并没有奏效,我编辑了这个问题,保持开放状态,看看是否有人可以进一步解释这个“只允许一个来源”.. .)
  • @Master_T — 正如这个答案所说,您必须根据 Origin 请求标头动态设置允许的来源。你试图设置一个硬编码的逗号分隔列表……这个答案没有建议(因为你不能)。
  • 所以基本上,如果我不能更改服务器的代码,我就完蛋了……好的,谢谢。
  • 您可以编写 Apache 配置,因此您可以更改服务器的代码(即使这涉及在 mod_perl 中编写中间件)。你甚至可以用 mod_rewrite 做到这一点。
猜你喜欢
  • 2018-10-09
  • 2019-02-08
  • 2020-09-21
  • 2017-06-23
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
相关资源
最近更新 更多