在mod_rewrite规则正则expression式中匹配问号

我正在寻找重写多个子string的url。 一个子string被请求作为一个子目录,而任何其他请求作为正常的查询string参数。

比如我想重写一下url

http://www.mysite.com/mark/friends?page=2 

 http://www.mysite.com/friends.php?user=mark&page=2 

除了问号字符之外,我能够做到这一点。 这是我的重写规则:

 ... RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends[?]?([^/\.]+)?$ friends.php?user=$1&$2 [L] 

如果我将问号更改为任何其他angular色,则效果很好。 似乎问题在于'?' 字符被错误地解释为一个新的查询string的开始。

我需要传递出现在/ user / friends之后的任何参数。 我如何做到这一点?

您应该使用[QSA]标志,而不是试图重写查询字符串。 [QSA]将查询字符串传递到重写的URL。

所以你的规则应该是这样的:

 ... RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L] 

你的情况与在mod_rewrite食谱中使用QSA标志的例子非常相似。

查询不是URL路径的一部分,因此不能用RewriteRule指令处理 。 这只能通过RewriteCond指令完成(请参阅%{QUERY_STRING} )。

但是正如Chad Birch已经说过的那样 ,只要设置QSA标志就可以自动将原始请求的查询添加到新的URL中。

除了使用重写标志QSA之外,还可以使用QUERY_STRING环境变量,如下所示:

 RewriteEngine On RewriteBase / RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING} 

和有问题的网址

 http://www.example.com/mark/friends?page=2 

将被重写(如指定):

 http://www.example.com/friends.php?user=mark&page=2