我想要的是
我希望能够在位置块内有条件地设置多个 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 确实不是为此而构建的。我在互联网上也找不到太多信息。有没有什么解决方法或更合理的方法可供我使用?