Search code examples
apache.htaccessmod-rewrite

I want to remove a string with a question mark at the end of my URL with .htaccess


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?


Solution

  • 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. %3F)

    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.