Regex .htaccess mod_rewrite在组为空时跳过捕获组

Regex .htaccess mod_rewrite在组为空时跳过捕获组,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我正在使用.htaccess重写带有两个分组的URL My.htaccess: RewriteRule ^tips/([0-9]*)/?([0-9]*)?/?(.+)?$ /tips.php?item=$1&id=$2 [L,QSA] 当URL中有两个数字时,它可以正常工作,但当其中一个为空时,它会完全跳过捕获组 example.com/tips/1/2/abc -> /tips.php?item=1&id=2 (EXPECTED) example.com/tips//

我正在使用.htaccess重写带有两个分组的URL

My.htaccess:

RewriteRule ^tips/([0-9]*)/?([0-9]*)?/?(.+)?$ /tips.php?item=$1&id=$2 [L,QSA]
当URL中有两个数字时,它可以正常工作,但当其中一个为空时,它会完全跳过捕获组

example.com/tips/1/2/abc -> /tips.php?item=1&id=2 (EXPECTED)

example.com/tips//2/abc  -> /tips.php?item=2&id=  (UNEXPECTED)
                            /tips.php?item=&id=2  (WHAT WAS EXPECTED)
我已经在一些regex/htaccess测试程序中使用了这一点,但他们似乎都说它应该像我预期的那样工作


(这当然是一个不寻常的URL,但我想将其传递给PHP,以便在PHP中处理错误。

您可以将此重写规则与\u请求变量一起使用:

选项-多视图
重新启动发动机
RewriteCond%{THE_REQUEST}\s/+tips/(\d*)/(\d*)/[NC]
重写规则^tips.php?项=%1&id=%2[L,QSA]

mod_rewrite
引擎在
RewriteRule
模式中将多个
/
转换为单个
/
,因此我们需要在此处使用
请求
,该请求与Apache中接收到的原始请求相匹配。

对于显示的示例,请尝试以下内容

Options -MultiViews
RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tips/(\d+)/(\d+)/?$ tips.php?item=$1&id=$2 [L,QSA]

这将查找不存在的文件/目录,并使用参数将它们重写为php文件,例如@anubhava sir提到的多个
/
斜杠将通过重写规则转换为单个
/
,因此这应该适用于您提到的两种情况。

非常感谢!这非常有效!