我想要的是

我想要的是

我想要的是

我希望能够在位置块内有条件地设置多个 nginx 指令。例如,对于位置 /example,proxy_cache_revalidate on如果$http_method是 POST,我想设置,否则我想设置proxy_cache_revalidate off。我还希望更多指令(如proxy_cache_valid和)add_header能够根据不同的变量(如远程 ip、cookie、内容类型等)有条件地设置。

对于不同的位置,这些条件必须看起来完全不同。

但为什么?

我不知道。我被雇来做这件事,这背后有很多钱,而我对这些要求没有任何发言权。没有一个理智的人会想实现这个。不过,希望我能在此过程中更多地了解 nginx。

我尝试过

我的第一个想法是使用if语句,但显然这些都是邪恶的并且无法以我想要的方式在位置块内使用。如果可行,我会写如下代码:

http {
    [...]
    server {
        [...]
        location /example {
            [...]

            if ($http_method = "POST") {
                proxy_cache_revalidate on;
            }
            else {  # yeah okay, there is no else-statement anyway, but you get the point...
                proxy_cache_revalidate off;
            }
        }
    }
}

然后我想我可以使用地图来解决这个问题。这些也不能用于位置块,所以事情会变得很混乱,但可能可行。我必须创建很多地图,每个位置块创建几个地图。

但事实证明这也不起作用:

http {
    [...]

    map $http_method $foo {
        POST on;
        default off;
    }

    server {
        [...]
        location /example {
            [...]

            proxy_cache_revalidate $foo;
        }
    }
}
nginx: [emerg] invalid value "$foo" in "proxy_cache_revalidate" directive, it must be "on" or "off" in /etc/nginx/nginx.conf:251

看来 nginx 确实不是为此而构建的。我在互联网上也找不到太多信息。有没有什么解决方法或更合理的方法可供我使用?

相关内容