Sid Kathirvel
Sid Kathirvel

Reputation: 858

HTACCESS 301 Redirect Rule to point all URL Variations to the Live URL

I am trying to achieve something which is working 99%, but there is a tiny issue.

Let's say my live URL is https://www.example.com/sample-page/

I want all the following URL variations to redirect to the live URL with a 301 status.

http://example.com/sample-page/
http://www.example.com/sample-page/
https://example.com/sample-page/

All of the above should redirect to https://www.example.com/sample-page/

I managed to get this working by using the htaccess rule displayed below.

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

The problem with the above rule is this: http://example.com/sample-page/ does a double redirect.

http://eyeacademy.com/expert-eye-examination/
301 Moved Permanently
https://eyeacademy.com/expert-eye-examination/
301 Moved Permanently
https://www.eyeacademy.com/expert-eye-examination/
200 OK

As you can see, http redirects to https and then https non-www redirects to https www. I have been trying a few tweaks to this rule and reading up, but I am sure someone here would have a quicker and more robust solution?

Upvotes: 1

Views: 655

Answers (2)

anubhava
anubhava

Reputation: 785531

You can use this single rule to redirect http -> https and add www and there is no need to hardcode host name in the rule:

RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,R=301,NE]

You can also reorder your existing rules and avoid multiple redirects like this:

# first add www and make sure it is https://
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

# http -> https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

Upvotes: 4

hjpotter92
hjpotter92

Reputation: 80649

Use an or flag in your RewriteCond directive. Replace everything with the following:

RewriteCond %{HTTPS} off [NC,OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.example.com%{REQUEST_URI} [L,R=301]

Upvotes: 1

Related Questions