我目前正在使用NGINX和Node。
在我的 NGINX 配置中,我按如下方式添加允许源标头,然后将其传递给包含我的 Node 应用程序的授权端口:
location /auth {
add_header Access-Control-Allow-Origin *;
proxy_pass http://watchdog:3000;
}
在我的 Node 中间件中,我还设置了标头以接受任何来源:
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
next();
}
当我这样做时,我的Chrome理所当然地抱怨我设置了两次标题:
The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.
在NGINX和Node中清楚地设置标头是多余的。
然而,令人着迷(和令人沮丧)的是,当我删除节点中间件同时保留NGINX标头时,我收到以下Chrome控制台错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
所以基本上错误声称要么 1) 标头设置了太多次,要么 2) 根本没有设置标头。
当我尝试第三种可能性时,错误消失了:只在 Node 中设置标头,而不是在 NGINX 中。
总而言之,以下是我的发现:
- 在NGINX和Node中设置标头不起作用
- 仅在 NGINX 中设置标头不起作用
- 在节点中设置标头仅有效
也就是说,我仍然不知道为什么这是解决方案。为什么只在 NGINX 中设置标题完全没有作用?也许是因为NGINX处理proxy_pass
的方式?
任何理论/解释将不胜感激。