nginx fügt einen Header hinzu, der von einer upstream_http_-Variablen abhängig ist

19

Ich habe einen Reverse-Proxy auf Nginx, die ziemlich viele Websites Proxys. Ich habe kürzlich HTTP Strict Transport Security für alle SSL-fähigen Websites aktiviert. Ich habe jetzt eine Website, auf der dies nicht aktiviert werden soll.

Ich dachte, ich würde nur eine einfache Überprüfung durchführen, ob mein Upstream mir bereits einen Strict-Transport-Security-header gesendet hat , und wenn nicht, fügen Sie einfach einen hinzu. Auf diese Weise könnte mein Upstream einen STS-Header mit senden max-age=0, um zu vermeiden, dass HSTS vom Proxy aktiviert wird.

Ich dachte, ich würde einfach meine Konfiguration wie folgt ändern:

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

Aber wahrscheinlich, weil, wenn es böse ist , das nicht funktioniert. Ich habe verschiedene Dinge versucht, um sicherzustellen, dass die Variable tatsächlich existiert (was der Fall ist), aber nichts scheint zu helfen.

Wie könnte ich diese Arbeit machen?

Gerry
quelle

Antworten:

22

Dies funktioniert nicht, da das if ausgewertet wird, bevor die Anforderung an das Backend übergeben wird, sodass die Variablen $ upstream_http_ noch keine Werte haben. add_header mit einem leeren Wert wird ignoriert, sodass Sie eine Map verwenden können, um den Header wie folgt bedingt hinzuzufügen:

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

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}
kolbyjack
quelle
1
Clevere Kartennutzung!
Alexey Ten
Ok, ich habe versucht, etwas anderes zu machen, aber ich konnte Nginx nicht herausfinden. Kannst du mir sagen, wo ich Nginx formal lernen kann? Und können Sie mir auch hier helfen: serverfault.com/questions/678521/…
Muhammad Umer
5

Das liegt daran, dass ifes ausgeführt wird, bevor der Proxy stattfindet und zu diesem Zeitpunkt keine Variable vorhanden ist $upstream_http_strict_transport_security.

Sie können die header_filter_by_luaDirektive aus dem Lua-Modul verwenden. Z.B

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';
Alexey Ten
quelle
1
Das funktioniert. Unter Debian 7 können Sie LUA-Unterstützung erhalten, indem Sie Nginx von Backports über verwenden apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes