我在 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_lua
Lua 模块中的指令。例如
header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';