Question

I am looking to rewrite urls with multiple substrings. One substring is being requested as a subdirectory, while any others are requested as normal query string parameters.

For example, I would like to rewrite urls from

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

to

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

I am able to accomplish this with the exception of the question mark character. Here is my rewrite rule:

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

If I change the question mark to any other character it works great. It seems like the problem is that the '?' character is being interpreted incorrectly as the start of a new query string.

I need to pass on any parameters that appear after /user/friends as is. How do I accomplish this?

Was it helpful?

Solution

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.

OTHER TIPS

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.

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top