nginx dodaje nagłówek zależny od zmiennej upstream_http_

19

Mam odwrotne proxy na nginx, które pośredniczy w wielu witrynach. Niedawno włączyłem HTTP Strict Transport Security dla wszystkich stron internetowych obsługujących SSL. Mam teraz jedną witrynę, która nie chce, aby ta funkcja była włączona.

Pomyślałem, że po prostu sprawdzę, czy mój poprzedni Strict-Transport-Securitykanał wysłał mi nagłówek, a jeśli nie, po prostu dodaj go. W ten sposób mój max-age=0serwer nadrzędny może wysłać nagłówek STS zawierający, aby uniknąć włączenia HSTS przez serwer proxy.

Pomyślałem, że po prostu zmienię konfigurację w następujący sposób:

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

Ale prawdopodobnie dlatego, że jeśli jest zły , to nie działa. Próbowałem wielu różnych rzeczy, aby upewnić się, że zmienna faktycznie istnieje (tak jest w rzeczywistości), ale wydaje się, że nic nie pomaga.

Jak mogę sprawić, żeby to działało?

Gerry
źródło

Odpowiedzi:

22

To nie działa, ponieważ if jest sprawdzane przed przekazaniem żądania do wewnętrznej bazy danych, więc zmienne $ upstream_http_ nie mają jeszcze żadnych wartości. add_header z pustą wartością jest ignorowany, więc możesz użyć mapy, aby warunkowo dodać nagłówek w następujący sposób:

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

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}
kolbyjack
źródło
1
Sprytne użycie mapy!
Alexey Ten
ok próbowałem zrobić coś trochę innego, ale nie mogłem rozgryźć Nginx. Czy możesz mi powiedzieć, gdzie mogę formalnie nauczyć się Nginx. A także możesz mi pomóc tutaj: serverfault.com/questions/678521/…
Muhammad Umer
5

Jest tak, ponieważ ifjest wykonywany przed wystąpieniem proxy i w tej chwili nie ma żadnej zmiennej $upstream_http_strict_transport_security.

Możesz użyć header_filter_by_luadyrektywy z modułu Lua. Na przykład

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';
Alexey Ten
źródło
1
To działa. W Debianie 7 możesz uzyskać wsparcie LUA, używając Nginx z backportów poprzez apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes,