以任意顺序匹配某些url参数的Regex



Im正在尝试在NGINX中设置缓存,并且只需要包括某些参数(如果给定(即可创建密钥并缓存站点。但如果参数的顺序不同,或者,也有可能,根本没有给出,我就无法使用它。

URL可以是:

https://www.example.com/xyz/
https://www.example.com/xyz/?param1=123&param2=456&param3=789
https://www.example.com/xyz/?param2=456&param3=789&param1=123
https://www.example.com/xyz/?param3=789&param1=123&param2=456
https://www.example.com/xyz/?param1=123&param3=789&param2=456
https://www.example.com/xyz/?param1=123&param2=456

只有路径和param1(可选(和param2(可选(与缓存相关。应忽略其他参数。所以最后我需要三个命名的捕获组,我可以为NGINX:创建映射

map $request_uri $request_uri_path {
"~^(?P<path>[^?]*)(?:?.*)?(?P<p1>param1=[^&]*)+(?:&.*)?(?P<p2>param3=[^&]*)+$"  $path$p1$p2;
}
fastcgi_cache_key "$scheme$request_method$host$request_uri_path";

但很明显,我的正则表达式不起作用https://regex101.com/r/Hf2jCj/1

~^(?P<path>[^?]*)(?:?.*)?(?P<p1>param1=[^&]*)+(?:&.*)?(?P<p2>param3=[^&]*)+$

使用map,您可以根据需要添加任意数量的正则表达式。将按顺序处理正则表达式,直到找到匹配项为止。有关详细信息,请参阅本文档。

在不太具体的模式之前列出更具体的模式。

您可能希望匹配包含param1+param3param3+param1的URL,模式之前,只匹配其中一个param的URL,在匹配两个param都不匹配的URL之前。

例如:

map $request_uri $request_uri_path {
~^(?<path>[^?]*)?([^&]*&)*(?<p1>param1=[^&]*)([^&]*&)*(?<p2>param3=[^&]*) $path$p1$p2;
~^(?<path>[^?]*)?([^&]*&)*(?<p2>param3=[^&]*)([^&]*&)*(?<p1>param1=[^&]*) $path$p1$p2;
~^(?<path>[^?]*)?([^&]*&)*(?<p1>param1=[^&]*)                              $path$p1;
~^(?<path>[^?]*)?([^&]*&)*(?<p2>param3=[^&]*)                              $path$p2;
~^(?<path>[^?]*)                                                             $path;
}

最新更新