如何将查询字符串变量与mod_rewrite匹配?

时间:2010-02-12 14:01:28

标签: regex apache mod-rewrite query-string

假设我的网址包含以下查询字符串参数:

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

使用mod_rewrite,如何将它们重定向到像这样的SES网址?

/DesignPatterns/139
/Refactoring/285

1 个答案:

答案 0 :(得分:100)

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

由于RewriteRule仅查看路径(最多但不包括问号),因此请使用RewriteCond捕获查询字符串中的值。

请注意,RewriteCond中的匹配项已在%1中捕获, %2等,而不是$1$2

另请注意?末尾的RewriteRule。它告诉mod_rewrite 不要将原始查询字符串附加到新URL,因此您最终会使用 /DesignPatterns/151 intead of /DesignPatterns/151?book=DesignPatterns&page=151

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

  1. L确保不会处理其他可能匹配的规则(换句话说,它确保这是处理的“最后”规则)。
  2. R=301会导致服务器发回重定向响应。 它不是重写,而是告诉客户再次使用新的 URL。 =301使其成为permanent redirect,因此除其他外,搜索引擎会知道用其索引中的新网址替换旧网址。