我使用 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 或 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 配置中的选项会阻止初始请求通过解析服务器,因此这不是一个选项。
我正在使用 apache2 版本2.4.29
和 parse-server 4.10.3
。
有谁知道让这个工作的方法?
首先,我认为了解 CORS 工作原理的一些背景知识很重要:
Access-Control
在响应中包含标头。那么我为什么这么说:我怀疑您需要
Access-Control-Allow-Origin
在 Apache 中设置标头以使请求“通过”的原因是您的 Apache 配置不是代理OPTION
请求。这会导致浏览器在飞行前请求中获得意外响应,并在尝试发出实际请求之前抛出 CORS 错误。由于 CORS 在浏览器中经过验证,因此 Apache 反向代理不应在其中发挥任何作用。当您的后端服务器(解析服务器)正确配置为处理 CORS 请求并发出正确的
Access-Control-*
标头时,无论您在其间放置多少代理,一切都应该正常工作。只要代理转发所有请求。或者,您可能希望在反向代理中“添加”CORS 配置,但这在这里似乎没有必要。由于您
Access-Control-Allow-Origin
在响应中看到两个标头,我怀疑解析服务器实际上已经在尝试处理 CORS 请求。我建议您首先检查您的 Apache 配置并确保
OPTION
将请求转发到解析服务器。如果不应该这样,我会查看浏览器在开发工具的网络选项卡中发出的请求:Access-Control-*
飞行前请求的响应标头是什么?您还可以
curl
通过设置源头来调用服务来调试这些东西。这样,您可以模拟对后端服务的请求并查看它发送的标头。
关于重复的标题,我最近在邮件列表上回答了一个类似的问题。
您必须仔细阅读Header 指令的配置参考以了解发生了什么。请参阅以下文本:“它不提供任何“标准化”单个标题列表“。本质上,据我了解,
onsuccess
(默认)和always
是两个单独的标题表(列表)的名称。尝试以下操作: