nginx: Pourquoi je ne peux pas mettre proxy_set_header dans une clause if?


9

Avec cette configuration:

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

J'ai cette erreur lorsque je recharge le service 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

Cette configuration fonctionne bien, mais elle ne fait pas ce que je veux:

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

Pourquoi je ne peux pas mettre la directive proxy_set_header dans une clause if?


S'il vous plaît ne pas cross-post. stackoverflow.com/questions/16500594/…
ceejayoz

J'ai ouvert un chat pour en discuter. Nous pouvons poursuivre la discussion là - bas: chat.stackexchange.com/rooms/8745/nginx
Neuquino

Réponses:


10

En supposant que vous vouliez réellement demander, `` comment puis-je faire fonctionner cela '', que diriez-vous de simplement réécrire pour que l'en-tête soit toujours passé, mais a-t-il la valeur ignorée si vous ne le voulez pas?

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

Tu veux dire "", non?
Michael Hampton

2
Personnellement, je préfère que les choses ne soient évidemment pas une valeur réelle, plutôt que d'oublier potentiellement que ce hack était en place, puis de me demander pourquoi l'en-tête était vide. Si elle est définie sur "X-Header-not-set-by-nginx", vous ne serez jamais confus.
Danack

Selon cet article: nginx.com/resources/wiki/start/topics/depth/ifisevil . Les seules choses 100% sûres qui peuvent être faites à l'intérieur si dans un contexte d'emplacement sont le retour et la réécriture. Je doute que le proxy_pass dans si le bloc fonctionnera toujours.
Chau Chee Yang

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.