I want to remove the string
?mobile=1
out from different URLs with .htaccess
. So:
https://www.example.com/?mobile=1
should become https://www.example.com/
and
https://www.example.com/something/?mobile=1
should become https://www.example.com/something/
I tried the following
RewriteEngine On
RewriteRule ^(. )?mobile=1 /$1 [R=301,L,NC]
But that does not seem to work. Any ideas?
CodePudding user response:
RewriteRule ^(. )?mobile=1 /$1 [R=301,L,NC]
The RewriteRule
pattern matches against the URL-path only, which notably excludes the query string. So the above would never match. (Unless there was a %-encoded ?
in the URL-path, eg. ?
)
To match the query string you need an additional condition (RewriteCond
directive) and match against the QUERY_STRING
server variable.
The regex .
(1 or more) will not match the document root (ie. your first example: https://www.example.com/?mobile=1
). You need to allow for an empty URL-path in this case. eg. .*
(0 or more).
For example, try the following near the top of your root .htaccess
file:
RewriteCond %{QUERY_STRING} =mobile=1
RewriteRule (.*) /$1 [QSD,R=301,L]
This matches the query string mobile=1
exactly, case-sensitive (as in your examples). No other URL parameters can exist. The =
prefix on the CondPattern makes this an exact match string comparison, rather than a regex as it normally would.
And redirects to the same URL-path, represented by the $1
backreference in the substitution string that contains the URL-path from the captured group in the RewriteRule
pattern.
The QSD
(Query String Discard) flag removes the query string from the redirect response.
Test first with a 302 (temporary) redirect and and only change to a 301 (permanent) - if that is the intention - once you have confirmed this works as intended. 301s are cached persistently by the browser so can make testing problematic.
CodePudding user response:
MrWhite is awesome, the following code worked perfectly:
RewriteCond %{QUERY_STRING} =mobile=1
RewriteRule (.*) /$1 [QSD,R=301,L]