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)
那是因为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';
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23217 次 |
最近记录: |