skip to Main Content

I am having a problem while redirecting a page whose URL was changed but I want old URL to be redirected to new. Here is .htaccess file

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/system.*
RewriteRule ^(.*)$ index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?/$1 [L]
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]

RewriteEngine On
RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]

Using mod_rewrite in the last line I am not getting redirected to new URL but when I use mod_alias(Redirect) rule I get redirected to new URL but Old URL gets appended to in it in this format.

https://example.com/contact-us/?/contactus/

I have searched Stack Overflow for solution to this problem and tried many similar scenarios but that didn’t work.

2

Answers


  1. Have it like this the given order.

    RewriteEngine On
    
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,NE,L]
    
    RewriteCond %{HTTP_HOST} ^www.example.com$ [NC]
    RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
    
    RewriteRule ^contactus/$ /contact-us/ [R=301,NC,L]
    
    RewriteCond %{REQUEST_URI} ^/system [NC]
    RewriteRule ^(.*)$ index.php?/$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php?/$1 [L]
    

    RewriteEngine On is not required multiple times in same .htaccess.

    Make sure to clear your browser cache before testing the change.

    Login or Signup to reply.
  2. RewriteEngine On
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://example.com/$1 [R,L]
    
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.example.com [NC]
    RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
    
    RewriteEngine On
    RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]
    

    Your mod_rewrite external redirects (the last three rules) are in the wrong place. These need to be before the internal rewrite (front-controller). By placing them at the end of the file they are never going to get processed for any URL other than static resources, since all other URLs are routed to index.php, at which point processing stops.

    when I use mod_alias(Redirect) rule I get redirected to new URL but Old URL gets appended

    Different modules are processed independently regardless of the order of the directives in the config file. mod_alias is processed after mod_rewrite – but it is processed. However, the Redirect directive is prefix matching and everything after the match is appended onto the end of the target URL.

    And there’s no need to repeat the RewriteEngine directives

    Have your directives like this:

    <IfModule mod_security.c>
      SecFilterEngine Off
      SecFilterScanPOST Off
    </IfModule>
    
    RewriteEngine On
    
    RewriteCond %{SERVER_PORT} 80
    RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^www.example.com [NC]
    RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
    
    RewriteRule ^contactus/$ http://example.com/contact-us/ [R=301,L]
    
    RewriteCond %{REQUEST_URI} ^/system
    RewriteRule ^(.*)$ index.php?/$1 [L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)$ index.php?/$1 [L]
    

    And make sure to clear your browser cache before testing. Preferably test with 302 (temporary) redirect to avoid caching issues.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search