我在nginx上有一个反向代理,代理了很多站点。 我最近为所有启用SSL的网站启用了HTTP严格传输安全性。 我现在有一个网站,不希望启用此function。
我想我只是做一个简单的检查,如果我的上游已经给我一个Strict-Transport-Security标题,如果没有,只需添加一个。 这样,我的上游可以发送一个包含max-age=0的STS头,以避免代理启用HSTS。
我想我只是改变我的configuration如下:
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"; } }
但是,可能是因为如果是邪恶 ,这是行不通的。 我已经尝试了一堆不同的东西,以确保variables实际存在(这是这种情况),但似乎没有任何帮助。
我怎么能做这个工作?
这是行不通的,因为在请求传递到后端之前,if被评估,所以$ upstream_http_variables没有任何值。 带有空值的add_header被忽略,所以你可以使用一个映射来有条件地添加如下头部:
map $upstream_http_strict_transport_security $sts { '' max-age=15552000; } server { location / { add_header Strict-Transport-Security $sts; } }
这是因为if在代理发生之前执行,并且此时没有variables$upstream_http_strict_transport_security 。
你可以使用Lua模块中的header_filter_by_lua指令。 例如
header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';