skip to Main Content

First of all, I know there are lots of answers on this, but I don’t actually find one that works. This is what I have in the .htaccess file right now, and I want to mention that it worked previously, but it does not anymore.

Redirect 301 /unt-de-cacao-de-plaja/filtre/producator/crisnatur/ /ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g

Options +FollowSymlinks

# Prevent Directoy listing
Options -Indexes

# Prevent Direct Access to files
<FilesMatch "(?i)((.tpl|.ini|.log|(?<!robots).txt))">
 Require all denied
## For apache 2.2 and older, replace "Require all denied" with these two lines :
# Order deny,allow
# Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
# If your opencart installation does not run on the main web folder make sure you folder it does run in ie. / becomes /shop/

RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L]
RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

# FORCE HTTPS AND NON WWW
RewriteEngine on

RewriteCond %{ENV:HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

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

As a mention, I will have a lot of Redirect 301 from old pages to the new ones since the entire structure has been changed.

And the links that I am redirecting inside my website come with “www” like:

https://www.example.com/unt-de-cacao-de-plaja/filtre/producator/crisnatur/

and needs to be redirected to:

https://example.com/ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g

2

Answers


  1. A few issues, in order of importance:

    1. You have your canonical HTTP to HTTPS and www to non-www redirects at the end of the file. By placing it at the end of the file, after your front-controller, it’s simply never going to be processed for most requests. This needs to be near the start of the .htaccess file, before your front-controller.

    2. You should avoid mixing redirects from both mod_alias (Redirect) and mod_rewrite (RewriteRule) in the same scope. Different modules execute at different times throughout the request, despite their apparent order in the config file. Since mod_rewrite is required for other redirects, you should convert the mod_alias Redirect directives to use RewriteRule instead.

      For example:

      RewriteRule ^unt-de-cacao-de-plaja/filtre/producator/crisnatur/$ /ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g [R=301,L]
      
    3. You should include the canonical scheme and hostname in your URL redirects in order to avoid multiple redirects when requesting an “old” URL at a non-canonical scheme ot hostname.

      For example:

      RewriteRule ^unt-de-cacao-de-plaja/filtre/producator/crisnatur/$ https://example.com/ingrijire-corporala/unt-cacao/unt-de-cacao-pentru-plaja-100g [R=301,L]
      
    4. Depending on what you mean exactly by “a lot of Redirect 301” – you should not be doing this at all in .htaccess and instead redirecting in your server-side script, once you have determined that the request will 404. This is to prioritise normal site visiters and not your redirects (that get executed on every single request).


    RewriteCond %{ENV:HTTPS} !on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
    

    Since you stated that these directives worked previously then I assume the use of the HTTPS environment variable is OK on your system. But note that, whilst this is relatively common, it’s non-standard. (It implies the server is using some kind of SSL front-end/proxy.)

    Note that the order of these rules will result in a double redirect when requesting http://www.example.com/<anything> (HTTP + www). Which is necessary if you are implementing HSTS, but otherwise, you should reverse these two rules to avoid this unnecessary double redirect.

    Login or Signup to reply.
  2. Redirect to https and non-www

    To instead redirect all requests to https and non-www, use the following code instead of the previous:

    Canonical HTTPS/non-WWW

    <IfModule mod_rewrite.c>
        RewriteCond %{HTTPS} off [OR]
        RewriteCond %{HTTP_HOST} ^www.example.com [NC]
        RewriteRule (.*) https://example.com/$1 [L,R=301]
    </IfModule>
    

    As before, place this code in the root .htaccess of your site. Here is what it’s doing:

    • Checks if mod_rewrite is available

    • Checks if HTTPS is off, or if the request includes www

    • If either condition matches, the request qualifies and is redirected
      to the https/non-www address

    OR

    RewriteEngine On
    RewriteCond %{HTTPS} off [OR]
    RewriteCond %{HTTP_HOST} ^www. [NC]
    RewriteCond %{HTTP_HOST} ^(?:www.)?(.+)$ [NC]
    RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search