By default the query string on the requested URL is appended to the rewritten/redirected URL.
On Apache 2.4+ you should use the QSD
(Query String Discard) flag on the RewriteRule
directive in order to discard the query string from the redirected URL. For example:
RewriteCond %{QUERY_STRING} =p=15
RewriteRule ^seasonal/christmas$ /holiday-decor/christmas.html [QSD,R=301,L]
The RewriteCond
directive is required in order to match the query string part of the requested URL. (The URL matched by the RewriteRule
pattern is the URL-path only, which notably excludes the query string.) The =
prefix on the CondPattern =p=15
indicates a literal "string" match (as opposed to a regex), so it matches p=15
exactly.
On Apache 2.2 and earlier you would instead need to append a ?
at the end of the RewriteRule
substitution, to remove the query string. This essentially writes a blank query string (the ?
does not actually become part of the redirected URL). Note that by appending any query string on the substitution string you overwrite the query string on the request. (If you needed to also append the original query string in this situation then you need the QSA
flag - Query String Append - but otherwise, this flag is not required.)
For example, on Apache 2.2, you would change the above RewriteRule
directive to read:
RewriteRule ^seasonal/christmas$ /holiday-decor/christmas.html? [R=301,L]
NB: Appending the ?
also works on Apache 2.4. Although using the QSD
flag is preferred. The two methods are not identical.