Search code examples
.htaccesshttp-redirectmod-rewritemod-alias

Redirect http to https and www to non-www in .htaccess


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

Solution

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