我正在使用一个简单的 nginx 实例将 REST 调用代理到另一台服务器。我的代理的目的是允许使用 cookie 进行身份验证。除了一个问题外,它已经正常工作。提供 REST 服务的服务器正在发送标头Access-Control-Allow-Origin *
。该标头对于基于 cookie 的身份验证来说太宽松了。我需要用更严格的标头替换该标头。
这是我的 nginx 配置的一个子集:
map $http_origin $cors_header {
default "";
"~^https?://[^/]+\.mydomain\.com(:[0-9]+)?$" $http_origin;
}
server {
location / {
proxy_pass https://myrestserver.com/api;
add_header Access-Control-Allow-Origin $cors_header;
add_header Access-Control-Allow-Credentials true;
}
}
我的问题是,我的响应中最终Access-Control-Allow-Origin
出现了两个标头。我该如何替换从 REST 服务器返回的标头,以便最终响应中只出现我的标头版本?
答案1
最好的办法是更改 REST 服务器端的响应,但是,假设您无法控制 REST 服务器,那么 Nginx 有一个名为 ngx_headers_more 的模块可以修改标头:https://github.com/openresty/headers-more-nginx-module
您必须安装该模块(这可能涉及从源代码构建 nginx 并在 ./configure 中添加模块,如 github 自述文件中所述)。对于您的特定问题,安装后,您可以在任何块中添加此指令
more_set_headers "Access-Control-Allow-Origin: $cors_header"
答案2
无需额外的 nginx 模块即可运行
proxy_hide_header 'access-control-allow-origin';
add_header 'access-control-allow-origin' '*';
答案3
关注exe 经销商回答,如果您使用 php 来设置标题,您可以这样做:
# always set a new header
add_header access-control-allow-origin "*" always;
# remove header that came from php
fastcgi_hide_header access-control-allow-origin;