.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 先生提到的多个 /
斜杠将被转换为单个 /
通过重写规则,所以这应该适用于您提到的两种情况。
我正在使用 .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 先生提到的多个 /
斜杠将被转换为单个 /
通过重写规则,所以这应该适用于您提到的两种情况。