Tricky .htaccess mod_rewrite syntax problem

Viewed 47

I got stuck, and even reading through tons of forum posts didn't help me.

The challenge: I need URIs to be rewritten and queries to be maintained

Examples 1:

example.com/test/23/result/7

shall be redirected to a script under

example.com/test/

That works quite well with an .htaccess entry like this:

RewriteCond %{QUERY_STRING} ^$
RewriteRule ^test/(.+)$ test/?s=$1

The URI is displayed unaltered. The called script is called, and the additional subdirectory definitions can be retrieved in PHP either through variable $_GET['s'] or $_SERVER['REQUEST_URI']. All is fine so far. The problem starts when adding a query string:

Example 2:

example.com/test/23/result/7?id=16

shall be redirected to the same script under

example.com/test/?id=16

Even when I add [QSA] to the rewrite rule, the URI is not parsed correctly. I tried several ways to initiate a redirect. All failed. The redirect either points to a non-existing address or the query string gets lost. Besides the initial URI subdirectory information, here I would need the query string to be evaluated in my script. Both pieces of data need to be transferred to it.

Does anyone have a solution?

Thanks a lot for sharing your expertise!

1 Answers

I would go with following htaccess Rules. This assumes that you have index.php file which is taking care of non-existing pages request in later your Rules.

RewriteEngine ON
##Rules for handling index.php url here.
RewriteCond %{THE_REQUEST} \s/([^/]*)/.*\?index\.php\s [NC]
RewriteRule ^ %1?%{QUERY_STRING} [NC,L]
##Rules for non-existing pages here.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

###Rest of your rules go here.....
Related