[英].htaccess mod_rewrite skips capture group when group is empty
我正在使用 .htaccess 重写具有两个分组的 URL。
我的 .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 中的错误。
您可以将此重写规则与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=$1&id=$2 [L,QSA]
这将查找不存在的文件/目录并将它们重写为带有参数的 php 文件,例如@anubhava 先生提到的多个/
斜杠将通过重写规则转换为单个/
所以这应该适用于您提到的两种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.