如何简化和缩短这些NGINX重写规则?

如何简化和缩短这些NGINX重写规则?,nginx,url-rewriting,Nginx,Url Rewriting,我有以下NGINX重写规则: rewrite ^/([^/]+)/?$ /page.php?a=$1 last; rewrite ^/([0-9]+)/?$ /page.php?b=$1 last; rewrite ^/(a|b)/?$ /page.php?c=$1 last; rewrite ^/([^/]+)/([0-9]+)/?$ /page.php?a=$1&b=$2 last; rewrite ^/([^/]+)/(a|b)/?$ /page.php?a=$1&c=$

我有以下NGINX重写规则:

rewrite ^/([^/]+)/?$ /page.php?a=$1 last;
rewrite ^/([0-9]+)/?$ /page.php?b=$1 last;
rewrite ^/(a|b)/?$ /page.php?c=$1 last;

rewrite ^/([^/]+)/([0-9]+)/?$ /page.php?a=$1&b=$2 last;
rewrite ^/([^/]+)/(a|b)/?$ /page.php?a=$1&c=$2 last;

rewrite ^/([^/]+)/([0-9]+)/(a|b)/?$ /page.php?a=$1&b=$2&c=$3 last;
如您所见,页面可以具有以下参数:

  • a
    b
    c
  • a
    b
    a
    c
  • a
    b
    c
但是,为每一页6行编写代码可能会有点过度工作,因为我假设
NGINX
需要处理这样的重写规则方案


我想知道如何简化这组规则,如果可能的话,它是如何工作的。

如果您的应用程序对空参数感到满意,您可以将每个捕获(及其前导的
/
)设置为可选的

例如:

rewrite ^(?:/([^/]+))?(?:/([0-9]+))?(?:/(a|b))?/?$ /page.php?a=$1&b=$2&c=$3 last;
非捕获组
(?:)
以及尾随的
使其成为可选组,并包含前导的
/
和一个捕获

您需要防止的一个副作用是,三个捕获都丢失了,即根URI
/


请参阅非捕获组。

我从未理解
(?:)
tbh的用法,它与通常的
)有什么不同?我尝试了与您编写的相同的
RegEx
,但没有
?:
,它的工作原理与使用它的工作原理相同,但这里有什么不同?除此之外,该规则运行良好。使用非捕获组避免将它们分配给
$
变量。如果改用
()
,这只意味着重写后的查询字符串将变为
?a=$2&b=$4&c=$6
我现在明白了,在尝试之后,我想问,如果我不需要空参数,如何防止空参数?