nginx: Warum kann ich proxy_set_header nicht in eine if-Klausel einfügen?

9

Mit dieser Konfiguration:

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

Ich habe diesen Fehler, wenn ich den Nginx-Dienst neu lade:

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

Diese Konfiguration funktioniert einwandfrei, macht aber nicht das, was ich will:

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

Warum kann ich die Anweisung proxy_set_header nicht in eine if-Klausel einfügen ?

Neuquino
quelle
Bitte nicht überkreuzen. stackoverflow.com/questions/16500594/…
ceejayoz
Ich habe einen Chat eröffnet, um darüber zu diskutieren. Wir können die Diskussion dort fortsetzen: chat.stackexchange.com/rooms/8745/nginx
Neuquino

Antworten:

9

Angenommen, Sie wollten tatsächlich fragen: "Wie kann ich das zum Laufen bringen?", Wie wäre es, wenn Sie nur neu schreiben, damit der Header immer übergeben wird, aber auf einen ignorierten Wert gesetzt wird, wenn Sie nicht möchten, dass er gesetzt wird.

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
quelle
Du meinst "", richtig?
Michael Hampton
2
Ich persönlich ziehe es vor, Dinge so einzustellen, dass sie offensichtlich keinen wirklichen Wert haben, anstatt möglicherweise zu vergessen, dass dieser Hack vorhanden war, und mich dann zu fragen, warum der Header leer war. Wenn es auf "X-Header-not-set-by-nginx" eingestellt ist, werden Sie nie verwirrt sein.
Danack
Laut diesem Artikel: nginx.com/resources/wiki/start/topics/depth/ifisevil . Die einzigen 100% sicheren Dinge, die im Kontext eines Standorts ausgeführt werden können, sind Zurückgeben und Umschreiben. Ich bezweifle, dass der proxy_pass in if block immer funktioniert.
Chau Chee Yang