nginx 根据upstream_http_变量添加标头条件

nginx 根据upstream_http_变量添加标头条件

我在 nginx 上有一个反向代理,它代理了不少网站。我最近为所有启用 SSL 的网站启用了 HTTP 严格传输安全。现在有一个网站不想启用此功能。

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

我想我只需要改变我的配置如下:

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";
        }
}

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

我怎样才能做到这一点?

答案1

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

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

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}

答案2

这是因为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';

相关内容