我使用 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-Origin
apache 配置中的选项会阻止初始请求到达 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 "*"