nginx aggiunge l'intestazione condizionale su una variabile upstream_http_


19

Ho un proxy inverso su nginx che inoltra molti siti. Di recente ho abilitato HTTP Strict Transport Security per tutti i siti Web abilitati per SSL. Ora ho un sito che non vuole averlo abilitato.

Ho pensato di fare un semplice controllo se il mio upstream mi Strict-Transport-Securityavesse già inviato un'intestazione e, in caso contrario, aggiungerne uno. In questo modo, il mio upstream potrebbe inviare un'intestazione STS contenente max-age=0per evitare che HSTS sia abilitato dal proxy.

Ho pensato di cambiare la mia configurazione come segue:

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

Ma, probabilmente perché se è malvagio , questo non funziona. Ho provato un sacco di cose diverse per assicurarmi che la variabile esista effettivamente (che è il caso), ma nulla sembra aiutare.

Come potrei farlo funzionare?

Risposte:


22

Questo non funziona perché if viene valutato prima che la richiesta venga passata al back-end, quindi le variabili $ upstream_http_ non hanno ancora alcun valore. add_header con un valore vuoto viene ignorato, quindi è possibile utilizzare una mappa per aggiungere in modo condizionale l'intestazione in questo modo:

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

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

1
Uso intelligente della mappa!
Alexey Ten,

ok ho provato a fare qualcosa di leggermente diverso ma non sono riuscito a capire nginx. Puoi dirmi dove posso imparare nginx formalmente. E anche tu puoi aiutarmi qui: serverfault.com/questions/678521/…
Muhammad Umer,

5

Questo perché ifviene eseguito prima che avvenga il proxy e in questo momento non ci sono variabili $upstream_http_strict_transport_security.

È possibile utilizzare la header_filter_by_luadirettiva dal modulo Lua. Per esempio

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';

1
Questo funziona Su Debian 7 puoi ottenere il supporto LUA usando Nginx dai backport tramite apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.