鉴于具有Swagger UI的API服务器,我想在docker容器中运行此服务器并从外部访问,并确保此服务器支持CORS。
请注意,如果存在任何Access-Control-Allow-Origin: <request.origin>
请求标头,则当前服务器实现设置响应标头Origin
,否则为Access-Control-Allow-Origin: *
。
因此,我将此服务器停靠,并且它在默认的docker接口0.0.0.0
上运行。在localhost或任何其他部署环境中,api通过cURL,邮递员等都可以。不会有任何麻烦。
当我从浏览器访问此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
请求标头不同,我认为这会导致此错误。例如,由于泊坞广告,Origin
为http://localhost:8080
而Host
为0.0.0.0:8080
。 CORS参考文献relevant part也提到了这一点。我想现代浏览器会根据此参考实施CORS检查。
我可以通过为所有请求设置Access-Control-Allow-Origin: *
响应标头来摆脱这种情况,但这只是一种解决方法而且不安全。
感谢任何指导和帮助。
答案 0 :(得分:0)
好的,一些事情:
Origin
是向服务器表明它是CORS请求的内容 - 如果Origin
请求标头未通过,则它不是跨源请求,因此您不需要发送任何 CORS响应标头。Access-Control-Allow-Origin: <value-of-Origin-request-header>
(你说你做了什么)绝对正确的事情。如果Origin
请求标头是您信任的标头,则可以添加代码以仅发送ACAO标头,但此时可能会变得过于复杂。Host
标头的值应该是无关紧要的 - 只要您在ACAO标头中发回Origin
标头的值,它就应该有效。Access-Control-Allow-Credentials: true
,否则浏览器将不会处理任何Set-Cookie响应标头。主要问题(我认为) - 支持OTPIONS请求:
您是正确的,浏览器可能会发送CORS预检OPTIONS请求,而非浏览器则不会。如果是这样,您需要执行以下操作:
Access-Control-Request-Method
和Access-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