Reputation: 689
I have a set of pages that I'm trying to redirect to new URLs. They have different query strings in the target URL than in the original URL.
http://localhost/people.php?who=a
should redirect to:
http://localhost/people/?t=leadership
And on and on...
I have the following set of rewrite rules and am obviously doing something very wrong.
RewriteRule ^people.php?who=a /people/?t=leadership [R=301,L]
RewriteRule ^people.php?who=f /people/?t=faculty [R=301,L]
RewriteRule ^people.php?who=p /people/?t=students [R=301,L]
RewriteRule ^people.php?who=r /people/ [R=301,L]
RewriteRule ^people.php /people/ [R=301,L]
What's happening is that the first 4 rules don't match and the page redirects to:
http://localhost/people/?who=a
I have tried the QSD flag, but it seems like my problem is that the rule isn't matching on the entire query string, not that it's passing the query string along.
Upvotes: 10
Views: 22125
Reputation: 143866
You need to match against the %{QUERY_STRING}
variable. The query string isn't part of the match in a RewriteRule
:
RewriteCond %{QUERY_STRING} ^who=a$
RewriteRule ^people.php$ /people/?t=leadership [R=301,L]
RewriteCond %{QUERY_STRING} ^who=f$
RewriteRule ^people.php$ /people/?t=faculty [R=301,L]
RewriteCond %{QUERY_STRING} ^who=p$
RewriteRule ^people.php$ /people/?t=students [R=301,L]
RewriteCond %{QUERY_STRING} ^who=r$
RewriteRule ^people.php$ /people/ [R=301,L]
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^people.php$ /people/ [R=301,L]
Upvotes: 17
Reputation: 784958
You cannot match QUERY_STRING
in RewruteRule
URI pattern:
Try your rules like this:
RewriteCond %{THE_REQUEST} \s/+people\.php\?who=a\s [NC]
RewriteRule ^ /people/?t=leadership [R=301,L]
RewriteCond %{THE_REQUEST} \s/+people\.php\?who=f\s [NC]
RewriteRule ^ /people/?t=faculty [R=301,L]
RewriteCond %{THE_REQUEST} \s/+people\.php\?who=p\s [NC]
RewriteRule ^ /people/?t=students [R=301,L]
RewriteCond %{THE_REQUEST} \s/+people\.php(\?who=r)?\s [NC]
RewriteRule ^ /people/? [R=301,L]
Upvotes: 1