nginx 在 upstream_http_ 变量上添加标头条件

Ger*_*rry 19 nginx reverse-proxy

我在 nginx 上有一个反向代理,它代理了很多站点。我最近为所有启用 SSL 的网站启用了 HTTP Strict Transport Security。我现在有一个不想启用此功能的站点。

我想我会做一个简单的检查,如果我的上游已经给我发送了一个Strict-Transport-Security-header,如果没有,就添加一个。这样,我的上游可以发送包含max-age=0避免代理启用 HSTS的 STS 标头。

我以为我只需按如下方式更改我的配置:

location / {
        proxy_pass http://webservers;

        proxy_redirect off;

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto "https";

        if ($upstream_http_strict_transport_security = "") {
                add_header Strict-Transport-Security "max-age=15552000";
        }
}
Run Code Online (Sandbox Code Playgroud)

但是,可能是因为if 是 evil,这不起作用。我尝试了很多不同的方法来确保变量确实存在(就是这种情况),但似乎没有任何帮助。

我怎么能让这个工作?

kol*_*ack 26

这不起作用,因为 if 在请求传递到后端之前被评估,所以 $upstream_http_ 变量还没有任何值。带有空值的 add_header 将被忽略,因此您可以使用映射来有条件地添加标题,如下所示:

map $upstream_http_strict_transport_security $sts {
  '' max-age=15552000;
}

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*Ten 7

那是因为if在代理发生之前执行,此时没有变量$upstream_http_strict_transport_security

您可以使用header_filter_by_luaLua 模块中的指令。例如

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';
Run Code Online (Sandbox Code Playgroud)