【发布时间】: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.
我还看到 Origin 和 Host 请求标头不同,我相信它会导致此错误。例如,由于 docker,Origin 是 http://localhost:8080 和 Host 是 0.0.0.0:8080。 CORS 参考的relevant part 也提到了这一点。我猜现代浏览器根据这个参考实现了 CORS 检查。
我可以通过为所有请求设置 Access-Control-Allow-Origin: * 响应标头来摆脱这种情况,但这只是一种解决方法,并不安全。
感谢任何指导和帮助。
【问题讨论】:
-
您是否尝试设置
Access-Control-Allow-Origin: <request.host>来验证您对Origin和Host不匹配问题的怀疑? -
抱歉回复晚了。由于主机
0.0.0.0对应所有地址,我使用*作为Access-Control-Allow-Origin标头的值。