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子句中?



我打开了一个聊天讨论此事。我们可以在那继续讨论:chat.stackexchange.com/rooms/8745/nginx
Neuquino 2013年

Answers:


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

你的意思是""吧?
迈克尔·汉普顿

2
我个人更喜欢将事物设置为显然不是真正的价值,而不是潜在地忘记此黑客已存在,然后想知道标题为何为空。如果将其设置为“ X-Header-not-set-by-nginx”,那么您永远不会感到困惑。
达纳克(Danack)

根据这篇文章:nginx.com/resources/wiki/start/topics/depth/ifisevil。如果在位置上下文中,则可以在内部完成的唯一100%安全的操作是返回并重写。我怀疑proxy_pass是否可以一直工作。
周其扬

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.