Search code examples
.htaccesshttp-redirectmod-rewriteurl-rewritingquery-string

Tricky .htaccess mod_rewrite syntax problem


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!


Solution

  • 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.....