Match Question Mark in mod_rewrite rule regex

Solution 1:

You should be using the [QSA] flag instead of trying to rewrite the query string. [QSA] passes on the query string to the rewritten URL.

So your rule should look like:

...
RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends/? friends.php?user=$1 [QSA,L]

Your case is very similar to the example given for using the QSA flag in the mod_rewrite cookbook.

Solution 2:

The query is not part of the URL path and thus cannot be processed with the RewriteRule directive. This can only be done with the RewriteCond directive (see %{QUERY_STRING}).

But as Chad Birch already said it suffices th set the QSA flag to automatically get the original requested query appended to the new URL.

Solution 3:

In addition to using the rewrite flag QSA, you can also use the QUERY_STRING environment variable as shown below:

RewriteEngine On
RewriteBase /
RewriteRule ^([A-Za-z0-9-_]+)/friends$ /friends.php?user=$1&%{QUERY_STRING}

And the URL in question

http://www.example.com/mark/friends?page=2

will be rewritten to (as specified):

http://www.example.com/friends.php?user=mark&page=2