mod_rewrite:使用\时,规则未满足?

时间:2016-04-30 07:47:06

标签: apache mod-rewrite

假设我有以下URI:

http://localhost:8888/service/bookshelf/book?bookID=1

在httpd.config中配置以下指令:

RewriteEngine On
RewriteRule bookshelf\/(.+)\?(.+)$ bookshelf.php?action=$1&$2 [L]

这个重写规则不匹配,我无法弄清楚/意识到原因。我的正则表达式看起来很好,如果我使用的不是\?。

,重写规则也可以

为什么会这样?

我希望它能输出如下内容:

http://localhost:8888/service/bookshelf.php?action=book&bookID=1

我知道这个计划看起来很奇怪,但为方便起见,这只是一张地图。

(我一直在使用http://htaccess.mwl.be来测试这个规则,但是它的输出与本地Apache / httpd的行为方式相匹配。)

1 个答案:

答案 0 :(得分:0)

如果您已在服务器配置中定义规则,则首先需要在规则中包含service,或设置RewriteBase。其次,查询字符串不会传递给请求URI,在这种情况下,您甚至不需要捕获它,因为QSA标志会为您执行此操作。请参阅下面的代码,以证明这一点:

RewriteEngine On
RewriteRule ^/?service/bookshelf/(.+)/?$ /service/bookshelf.php?action=$1 [QSA,L]

在该规则中,我添加了开始/结束边界(^$),并使用/?使尾部斜杠可选。这也出现在规则的开头,因为在服务器配置上下文中包含了前导斜杠(这样,服务器配置和.htaccess上下文都满足规则)。

添加了QSA标志 - 这会自动将请求查询字符串附加到重写目标。

现在,service/bookshelf/book?bookID=67的请求将在内部重写为service/bookshelf.php?action=book&bookID=67。您可以在bookshelf.php中输入以下内容进行测试:

<?php var_dump($_GET);