“不允许 CORS 多源”-使用解析服务器和 apache2

“不允许 CORS 多源”-使用解析服务器和 apache2

我使用 apache2 作为解析服务器的反向代理。为了允许跨源请求,我最初尝试设置:

Header always set Access-Control-Allow-Origin "*"

在 apache 配置文件中还有:

ProxyPass /parse/ http://localhost:1337/parse/
ProxyPassReverse /parse/ http://localhost:1337/parse/
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

设置此项后,请求已成功从 apache 转发到我的解析服务器。但是现在我的 Webapp 抛出了CORS Multiple Origin Not Allowed

在我的浏览器的开发者控制台中,我可以看到此 Access-Control-Allow-Origin 选项被设置了两次。

在此处输入图片描述

我已经确认第二次出现这种情况是由于 parse-server 造成的。但是我找不到阻止 parse-server 或 apache 在响应中设置此选项的方法。

我尝试将 apache 配置中的初始行更改为:

1.

Header always setifempty Access-Control-Allow-Origin "*"
Header always add Access-Control-Allow-Origin "*"
Header always add Access-Control-Allow-Origin "*"
Header always edit Access-Control-Allow-Origin "^$" "*"

这些尝试都没有改变任何东西。但是,删除Access-Control-Allow-Originapache 配置中的选项会阻止初始请求到达 parse-server,因此这不是一个选项。

我正在使用 apache2 版本2.4.29和 parse-server 4.10.3

有人知道如何让它工作吗?

答案1

首先,我认为了解 CORS 的工作原理很重要:

  • CORS 由浏览器在客户端进行验证。
  • 要验证某个来源(不同的域、协议或端口)是否被允许访问另一个来源,飞行前请求可能在实际跨域请求之前发出。此请求使用 OPTIONS 方法,并且需要Access-Control在响应中包含标头。

Access-Control-Allow-Origin那么我为什么这么说呢:我怀疑你需要在 Apache 中设置请求头以使请求“通过”的原因是你的 Apache 配置没有代理OPTION请求。这导致浏览器在预检请求中收到意外响应,并在尝试发出实际请求之前抛出 CORS 错误。

由于 CORS 在浏览器中得到验证,因此 Apache 反向代理不应在其中发挥任何作用。当您的后端服务器 (parse-server) 正确配置为处理 CORS 请求并发送正确的Access-Control-*标头时,无论您在中间放置多少个代理,一切都应该正常工作。只要代理转发所有请求即可。

或者,您可能希望在反向代理中“添加” CORS 配置,但这似乎没有必要。由于您Access-Control-Allow-Origin在响应中看到两个标头,我怀疑解析服务器实际上已经在尝试处理 CORS 请求。

我建议您首先检查 Apache 配置,并确保OPTION请求已转发到解析服务器。如果不能,我会在开发工具的网络选项卡中查看浏览器发出的请求:

  • 飞行前请求是什么样的?有飞行前请求吗?
  • 它成功还是失败了?出现了什么错误?
  • Access-Control-*飞行前请求的响应标头是什么?
  • 最终请求是否已发出?该请求的响应标头是什么?

curl您还可以通过设置源标头来调用服务来调试这些内容。

curl -v -X PUT -H "Origin: https://example.com" https://www.example.org

这样,您可以模拟对后端服务的请求并查看它发送的标头。

答案2

在我的浏览器的开发者控制台中,我可以看到此 Access-Control-Allow-Origin 选项被设置了两次。

关于重复的标题,我回答了类似的问题最近在邮件列表上。

你必须阅读Header 指令的配置参考仔细了解发生了什么。请参阅以下文本:“它不提供任何“规范化”的单一标题列表“。本质上,正如我所理解的,onsuccess(默认)和always是两个单独的标题表(列表)的名称。

请尝试以下操作:

Header onsuccess unset Access-Control-Allow-Origin
Header always set Access-Control-Allow-Origin "*"

相关内容