nginx:为什么我不能将 proxy_set_header 放在 if 子句中?

nginx:为什么我不能将 proxy_set_header 放在 if 子句中?

使用以下配置:

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_headerif 子句内的指令?

答案1

假设您实际上想问的是“我怎样才能让它工作”,那么如何只需重写以便始终传递标题,但如果您不想设置它,则将其设置为某个忽略的值。

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

答案2

在 nginx 配置中,“If” 通常是一种不好的做法。您可以使用 map 模块来使事情正常运作。请参阅http://nginx.org/en/docs/http/ngx_http_map_module.html http://wiki.nginx.org/HttpMapModule

相关内容