我正在寻找重写多个子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