假设我有以下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的行为方式相匹配。)
答案 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);