views:

1179

answers:

2

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?

+6  A: 

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.

Chad Birch
markb
+4  A: 

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.

Gumbo