This may be obvious for some mod_rewrite experts but I spent a lot of time to figure it out and I get the feeling I hd this problem before and I forgot what the solution was so here it is:
Mod rewrite does NOT match your pattern on the query string but only on the path part of the URL.
To match the query string you must use the RewriteCond rule.
From mod_rewrite documentation:
Note: Query String
The Pattern will not be matched against the query string. Instead, you must use a
RewriteCond
with the%{QUERY_STRING}
variable. You can, however, create URLs in the substitution string, containing a query string part. Simply use a question mark inside the substitution string, to indicate that the following text should be re-injected into the query string. When you want to erase an existing query string, end the substitution string with just a question mark. To combine a new query string with an old one, use the[QSA]
flag.
That last part about QSA was the one that made me rediscover this 🙂