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

Mic*_*lor 11 nginx cors

我正在使用一个简单的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是Access-Control-Allow-Origin我的响应中出现了两个标题。如何替换从 REST 服务器返回的标头,以便只有我的标头版本出现在最终响应中?

小智 23

这无需额外的 nginx 模块即可工作

proxy_hide_header 'access-control-allow-origin';
add_header 'access-control-allow-origin' '*';
Run Code Online (Sandbox Code Playgroud)

  • @Pierre.Vriens 您可以使用“proxy_hide_header”隐藏从代理服务器返回的“Access-Control-Allow-Origin”,然后使用“add_header”添加自己的自定义标头。据我所知,这个答案是“替换”Nginx 标头的唯一方法。给我点赞吧! (3认同)
  • 我不明白 (2认同)

sui*_*ome 7

最好的办法是更改 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"
Run Code Online (Sandbox Code Playgroud)

  • 你其实没有!正如文档所说,more_set_headers“替换(如果有)或添加(如果没有)指定的输出头......”但我怀疑谨慎的方法会增加显着的开销。 (2认同)