【发布时间】:2022-04-13 01:08:07
【问题描述】:
我的客户端 Web 应用程序是使用 Angular 编写的,而服务器端是 AWS API 网关。
我收到了错误:
Access to XMLHttpRequest at <my destiniation> from origin <my origin> has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
其中<my destination> 和<my origin> 不是同一个域。
问题是我确实有 CORS 设置来支持这一点。我的设置使用预检 OPTIONS 请求,然后是 PUT 请求(PUT 是失败的 403,控制台显示 CORS 错误)。 OPTIONS 请求的响应实际上包含access-control-allow-origin: *,最奇怪的是,我的 PUT 请求只有在我的一个(或多个)URL 参数参数中包含 %23 时才会失败(例如,由于URL 编码 # 符号)。
有谁知道为什么 URL 参数中的特殊字符会触发 CORS 错误,而没有特殊字符的完全相同的请求通过 CORS 没有任何问题?我会错过什么?
【问题讨论】:
-
当请求因请求URL中的%23而失败时,响应的HTTP状态码是什么?如果响应的状态码不是 200 OK,而是 4xx 或 5xx 错误响应,那么您实际上没有需要解决的 CORS 问题。相反,您需要解决 4xx 或 5xx 错误问题。
-
预检 OPTIONS 以 200 成功,但以下 PUT 以 403 失败。您认为这意味着 CORS 是红鲱鱼?
-
是的,如果你得到一个 403,那么 CORS 与原因的关系就是红鲱鱼。因此,无论是什么导致您遇到 403,都不是您的 CORS 配置。浏览器在您引用的错误消息中提到 CORS 的唯一原因是服务器没有将 Access-Control-Allow-Origin 标头添加到该 403 响应中。服务器上的 CORS 配置永远不会导致服务器拒绝请求——所有实际的 CORS 阻塞都是由客户端的浏览器完成的。 CORS 配置唯一会导致发生的事情是让服务器发送 Access-Control-Allow-* 标头。
-
谢谢!这帮助了很多。