nginx: почему я не могу поместить proxy_set_header в предложение if?

9

С этой конфигурацией:

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

У меня есть эта ошибка при перезагрузке службы 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

Эта конфигурация работает нормально, но она не делает то, что я хочу:

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

Почему я не могу поместить директиву proxy_set_header в предложение if?

Neuquino
источник
Пожалуйста, не кросс-пост. stackoverflow.com/questions/16500594/…
ceejayoz
Я открыл чат, чтобы обсудить это. Мы можем продолжить обсуждение там: chat.stackexchange.com/rooms/8745/nginx
Neuquino

Ответы:

10

Предполагая, что вы на самом деле хотели спросить: «Как я могу заставить это работать», как насчет просто переписать, чтобы заголовок всегда передавался, но ему было присвоено какое-то игнорируемое значение, если вы не хотите, чтобы он устанавливался.

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
источник
Вы имеете в виду "", верно?
Майкл Хэмптон
2
Лично я предпочитаю устанавливать вещи как явно не реальные значения, а не забывать, что этот хак был на месте, а потом удивляться, почему заголовок пуст. Если он установлен в «X-Header-not-set-by-nginx», то вы никогда не будете смущены.
Данак
Согласно этой статье: nginx.com/resources/wiki/start/topics/depth/ifisevil . Единственные 100% безопасные вещи, которые могут быть сделаны внутри, если в контексте местоположения, возвращаются и переписываются. Я сомневаюсь, что proxy_pass в блоке будет работать всегда.
Чау Чи Ян