How can I match query string variables with mod_rewrite?
Suppose I have URLs with query string parameters like these:
/index.php?book=DesignPatterns&page=139
/index.php?book=Refactoring&page=285
Using mod_rewrite, how can I redirect them to SES 开发者_Go百科URLs like these?
/DesignPatterns/139
/Refactoring/285
RewriteCond %{QUERY_STRING} book=(\w+)&page=(\d+)
RewriteRule ^index.php /%1/%2? [L,R=301]
Because RewriteRule only looks at the path (up to but not including the question mark), use RewriteCond to capture the values in the query string.
Note that the matches from RewriteCond
are captured in %1
,
%2
, etc., rather than $1
, $2
, etc.
Also note the ?
at the end of RewriteRule
. It tells mod_rewrite
not to append the original query string to the new URL, so you end up with
/DesignPatterns/151
intead of
/DesignPatterns/151?book=DesignPatterns&page=151
.
The [L,R=301]
flags do two things:
L
ensures that no other rules that might otherwise match will be processed (in other words, it ensures this is the "last" rule processed).R=301
causes the server to send back a redirect response. Instead of rewriting, it tells the client to try again with the new URL. The=301
makes it a permanent redirect, so that, among other things, search engines will know to replace the old URL with the new URL in their indexes.
精彩评论