如何使用 nginx 替换代理响应中的 Access-Control-Allow-Origin 标头

如何使用 nginx 替换代理响应中的 Access-Control-Allow-Origin 标头

我正在使用一个简单的 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;

相关内容