繁体   English   中英

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

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM