adiian
adiian

Reputation: 1392

.htaccess redirect 301 using rewrite rule

I'm trying to beautify some urls. I configured the htaccess file so my urls are changed:

old url: http://mysite.com/index.php?id=45tye4 new url: http://mysite.com/45tye4

I want now to permanently redirect old urls to new urls. This is what I try with no luck:

RewriteRule ^index.php?id=(.*)$ $1 [R=301,L]

The main problem seems to be the '?' in the url. When I try the same url without ? the redirect works. I also tried other variants with no luck:

RewriteRule ^index.php\?id=(.*)$ $1 [R=301,L]
RewriteRule ^index.php[\?]id=(.*)$ $1 [R=301,L]

Update:

I added the redirection according to anubhava instructions. The redirection works, but unfortunately I get into a redirect loop. I thought [L] flag should solve the redirection loop, but it doesn't.

RewriteCond %{QUERY_STRING} ^id=(.*)$
RewriteRule ^index\.php/?$ /%1? [R=301,L] 

RewriteRule ^(.*)$ index.php?id=$1 [L]

Upvotes: 0

Views: 2403

Answers (1)

anubhava
anubhava

Reputation: 786329

RewriteRule matches only REQUEST_URI. You have to use RewriteCond to match Query string

Try this code:

Options +FollowSymlinks -MultiViews
RewriteEngine on

RewriteCond %{THE_REQUEST} ^GET\s/+index\.php [NC]
RewriteCond %{QUERY_STRING} (^|&|\?)id=(.*)(&|$) [NC]
RewriteRule . /%2? [R=301,L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?id=$1 [L]

This will redirect old URI of /index.php?id=45tye4 to new URI: /45tye4

Upvotes: 1

Related Questions