Nginx添加标头条件为upstream_http_变量


19

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

我以为如果上游已经给我发送了Strict-Transport-Security-header,我将做一个简单的检查,否则,只需添加一个。这样,我的上游可以发送一个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";
        }
}

但是,可能是因为如果是邪恶的话,这是行不通的。我尝试了很多其他方法来确保变量确实存在(这种情况),但是似乎没有任何帮助。

我该如何进行这项工作?

Answers:


22

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

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

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

1
巧妙使用地图!
Alexey 2014年

好的,我一直在尝试做一些不同的事情,但是我无法弄清楚nginx。您能告诉我在哪里可以正式学习nginx。您也可以在这里为我提供帮助:serverfault.com/questions/678521/…–
穆罕默德·乌默尔

5

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

1
这可行。在Debian 7上,您可以通过从backports使用Nginx获得LUA支持apt-get -t wheezy-backports install nginx-extras
Pieter Ennes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.