nginx agregar encabezado condicional en una variable upstream_http_

19

Tengo un proxy inverso en nginx que representa bastantes sitios. Recientemente he habilitado HTTP Strict Transport Security para todos los sitios web habilitados para SSL. Ahora tengo un sitio que no quiere tener esto habilitado.

Pensé que simplemente haría una simple verificación si mi Strict-Transport-Securityflujo ascendente ya me envió un encabezado, y si no, solo agregue uno. De esa manera, mi flujo ascendente podría enviar un encabezado STS que contenga max-age=0para evitar tener HSTS habilitado por el proxy.

Pensé que simplemente cambiaría mi configuración de la siguiente manera:

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

Pero, probablemente porque si es malo , esto no funciona. He intentado un montón de cosas diferentes para asegurarme de que la variable realmente exista (que es el caso), pero nada parece ayudar.

¿Cómo podría hacer que esto funcione?

Gerry
fuente

Respuestas:

22

Esto no funciona porque el if se evalúa antes de que la solicitud se pase al backend, por lo que las variables $ upstream_http_ aún no tienen ningún valor. add_header con un valor vacío se ignora, por lo que puede usar un mapa para agregar condicionalmente el encabezado de la siguiente manera:

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

server {
  location / {
    add_header Strict-Transport-Security $sts;
  }
}
kolbyjack
fuente
1
¡Uso inteligente del mapa!
Alexey Ten
ok, he estado tratando de hacer algo un poco diferente, pero no pude entender nginx. ¿Me puede decir dónde puedo aprender nginx formalmente? Y también me pueden ayudar aquí: serverfault.com/questions/678521/…
Muhammad Umer
5

Esto se debe a que ifse ejecuta antes de que tenga lugar el proxy y en este momento no hay ninguna variable $upstream_http_strict_transport_security.

Podrías usar header_filter_by_lua directiva del módulo Lua. P.ej

header_filter_by_lua 'if not ngx.header["X-Test"] then ngx.header["X-Test"] = "blah" end';
Alexey Ten
fuente
1
Esto funciona. En Debian 7 puede obtener soporte LUA utilizando Nginx desde backports a través de apt-get -t wheezy-backports install nginx-extras.
Pieter Ennes