nginx: ¿Por qué no puedo poner proxy_set_header dentro de una cláusula if?

9

Con esta configuración:

server {
    listen 8080;
    location / {
        if ($http_cookie ~* "mycookie") {
            proxy_set_header X-Request $request;
            proxy_pass http://localhost:8081;
        }
    }
}

Tengo este error cuando vuelvo a cargar el servicio nginx:

Reloading nginx configuration: nginx: [emerg] "proxy_set_header" directive is not allowed here in /etc/nginx/conf.d/check_cookie.conf:5
nginx: configuration file /etc/nginx/nginx.conf test failed

Esta configuración funciona bien, pero no hace lo que quiero:

server {
    listen 8080;
    location / {
        proxy_set_header X-Request $request;
        if ($http_cookie ~* "mycookie") {
            proxy_pass http://localhost:8081;
        }
    }
}

¿Por qué no puedo poner la directiva proxy_set_header dentro de una cláusula if?

Neuquino
fuente
Por favor, no publique mensajes cruzados. stackoverflow.com/questions/16500594/…
ceejayoz
Abrí un chat para discutir sobre esto. Podemos continuar la discusión allí: chat.stackexchange.com/rooms/8745/nginx
Neuquino

Respuestas:

10

Suponiendo que realmente quisiste preguntar, '¿cómo puedo hacer que esto funcione?', ¿Qué tal si simplemente reescribes para que el encabezado siempre se pase, pero lo tiene configurado en algún valor ignorado si no quieres que se establezca?

server {
    listen 8080;    
    location / {
        set $xheader "someignoredvalue";

        if ($http_cookie ~* "mycookie") {
            set $xheader $request;
        }

        proxy_set_header X-Request $xheader;

        if ($http_cookie ~* "mycookie") {
            proxy_pass http://localhost:8081;
        }
    }
Danack
fuente
¿Quieres decir ""verdad?
Michael Hampton
2
Personalmente, prefiero configurar las cosas para que obviamente no sean un valor real, en lugar de olvidar potencialmente que este truco estaba en su lugar, y luego preguntarme por qué el encabezado estaba vacío. Si está configurado en "X-Header-not-set-by-nginx", nunca te confundirán.
Danack
De acuerdo con este artículo: nginx.com/resources/wiki/start/topics/depth/ifisevil . Las únicas cosas 100% seguras que se pueden hacer dentro de un contexto de ubicación son devolver y reescribir. Dudo el proxy_pass en si el bloque siempre funcionará.
Chau Chee Yang