【问题标题】:CORS supported & dockerized web server支持 CORS 和 dockerized Web 服务器
【发布时间】:2018-09-15 15:06:48
【问题描述】:

给定一个带有 Swagger UI 的 API 服务器,我想在 docker 容器中运行该服务器并从外部访问,并确保该服务器支持 CORS。

注意当前服务器实现设置响应头Access-Control-Allow-Origin: <request.origin>,如果存在Origin请求头,否则为Access-Control-Allow-Origin: *

所以,我对这个服务器进行了 docker 化,它在默认的 docker 接口 0.0.0.0 上运行。在 localhost 或任何其他部署环境下,通过 cURL、postman 等 api 就可以了。不要麻烦。

当我从浏览器访问这个 dockerized 服务器以使用 Swagger UI 时,我看到指示 OPTIONS 请求不成功的错误。与 CLI 工具不同,浏览器在实际发送之前发送OPTIONS 请求。检查开发者控制台后,我看到我得到了No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin is therefore not allowed access.

我还看到 OriginHost 请求标头不同,我相信它会导致此错误。例如,由于 docker,Originhttp://localhost:8080Host0.0.0.0:8080。 CORS 参考的relevant part 也提到了这一点。我猜现代浏览器根据这个参考实现了 CORS 检查。

我可以通过为所有请求设置 Access-Control-Allow-Origin: * 响应标头来摆脱这种情况,但这只是一种解决方法,并不安全。

感谢任何指导和帮助。

【问题讨论】:

  • 您是否尝试设置Access-Control-Allow-Origin: <request.host> 来验证您对OriginHost 不匹配问题的怀疑?
  • 抱歉回复晚了。由于主机0.0.0.0对应所有地址,我使用*作为Access-Control-Allow-Origin标头的值。

标签: http docker cors


【解决方案1】:

好的,有几件事:

  1. Origin 向服务器表明这是一个 CORS 请求 - 如果未传递 Origin 请求标头,则它不是跨域请求,因此您不需要发送 any CORS 响应标头。
  2. 发送Access-Control-Allow-Origin: <value-of-Origin-request-header>(你说你在做什么)是绝对正确的做法。如果 Origin 请求标头是您信任的标头,您可以添加代码以仅发送 ACAO 标头,但这可能会变得过于复杂。
  3. Host 标头的值应该无关紧要 - 只要您在 ACAO 标头中发回 Origin 标头的值,它就可以工作。
  4. 如果您在请求中传递 cookie,则还需要返回 Access-Control-Allow-Credentials: true,否则浏览器不会处理任何 Set-Cookie 响应标头。

主要问题(我认为) - 支持 OTPIONS 请求:

您是正确的,浏览器可能会发送 CORS 预检 OPTIONS 请求,而非浏览器则不会。如果是这样,您需要执行以下操作:

  • 确保您的服务器支持 OPTIONS 请求(默认情况下,许多 Web 服务器仅支持开箱即用的 GET、POST 和 HEAD)
  • 返回与该 OPTIONS 请求的响应完全相同的 ACAO 标头
  • 处理通过预检 OPTIONS 请求传递的其他 CORS 请求标头 - Access-Control-Request-MethodAccess-Control-Request-Headers

最后一点可能很棘手,但最简单的做法是将以下响应标头返回到 OPTIONS 请求:

Access-Control-Allow-Origin: <value-of-Origin-request-header> Access-Control-Allow-Credentials: true Access-Control-Allow-Method: <value-of-Access-Control-Request-Method-request-header> Access-Control-Allow-Headers: <value-of-Access-Control-Request-Headers-request-header>

并在主 GET/POST 请求中返回以下响应标头:

Access-Control-Allow-Origin: <value-of-Origin-request-header> Access-Control-Allow-Credentials: true

【讨论】:

  • 感谢您的回答。我最终设置了Access-Control-Allow-Origin: *
猜你喜欢
  • 2011-06-24
  • 2017-11-11
  • 2016-10-16
  • 2014-12-31
  • 1970-01-01
  • 2013-06-18
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多