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

.htaccess mod_rewrite skips capture group when group is empty

我正在使用 .htaccess 用两个分组重写 URLs。

我的.htaccess:

RewriteRule ^tips/([0-9]*)/?([0-9]*)?/?(.+)?$ /tips.php?item=&id= [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 中的错误。

您可以将此重写规则与 THE_REQUEST 变量一起使用:

Options -MultiViews
RewriteEngine On

RewriteCond %{THE_REQUEST} \s/+tips/(\d*)/(\d*)/ [NC]
RewriteRule ^ tips.php?item=%1&id=%2 [L,QSA]

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

根据您展示的示例,请您尝试以下操作。

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

这将查找不存在的 files/directories 并使用参数将它们重写到 php 文件,就像@anubhava 先生提到的多个 / 斜杠将被转换为单个 / 通过重写规则,所以这应该适用于您提到的两种情况。