我怎样才能匹配查询stringvariables与mod_rewrite?

假设我有这样的查询string参数的URL:

/index.php?book=DesignPatterns&page=139 /index.php?book=Refactoring&page=285 

使用mod_rewrite ,我如何将它们redirect到这样的SES URL?

 /DesignPatterns/139 /Refactoring/285 
 RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+) RewriteRule ^index.php /%1/%2? [L,R=301] 

由于RewriteRule只查看path(最多但不包括问号),使用RewriteCond来捕获查询string中的值。

请注意,来自RewriteCond的匹配被捕获在%1%2等中,而不是$1$2等。

还要注意?RewriteRule的最后。 它告诉mod_rewrite不要将原始的查询string追加到新的URL中,所以你最终得到/DesignPatterns/151?book=DesignPatterns&page=151

[L,R=301]标志做两件事:

  1. L确保不会处理其他可能匹配的规则(换句话说,它确保这是处理的“最后”规则)。
  2. R=301使服务器发回一个redirect响应。 它不会重写,而是告诉客户端再次尝试使用新的URL。 =301使它成为一个永久性的redirect ,所以search引擎会知道用他们的索引中的新URLreplace旧的URL。