我希望通过从请求中删除不相关的查询参数(可能来自网络爬虫或类似的)来改进 nginx 缓存。我在互联网上遇到了一个笨拙的解决方案:
set $c_uri $args; # e.g. "param1=true¶m4=false"
# remove unwanted parameters one by one
if ($c_uri ~ (.*)(?:&|^)pd=[^&]*(.*)) { set $c_uri $1$2 ; }
if ($c_uri ~ (.*)(?:&|^)mid=[^&]*(.*)) { set $c_uri $1$2 ; }
if ($c_uri ~ (.*)(?:&|^)ml=[^&]*(.*)) { set $c_uri $1$2 ; }
if ($c_uri ~ (.*)(?:&|^)contact_eid=[^&]*(.*)) { set $c_uri $1$2 ; }
...
set $c_uri $scheme://$host$uri$c_uri;
...
location / {
# set $c_uri as cache_key
proxy_cache_key $c_uri;
...
}
它有效,但不是很简洁,需要很多步骤,并且从我所学到的,如果是邪恶的。
我知道有些地图可以做基本的正则表达式,但在这种情况下它们不起作用(因为我需要删除任意数量的参数以任何顺序)。
我还发现这个替换模块可以进行正则表达式替换,但它只用于特定操作而不是设置变量。
所以我有两个问题:
- 有谁知道是否有一些工具可以通过执行正则表达式替换操作来设置变量?
- 在这种情况下使用 if 真的那么糟糕吗?它不在位置上下文中,我不知道是否许多连续的正则表达式实际上比一个大的正则表达式替换更差。
如果有更多 nginx 专业知识的人可以在这里权衡并帮助我,我将非常感激。谢谢 :)