htaccess force https and redirect www to non-www, but no other subdomains
I know there are many similar threads, but none of them seems to match my exact problem. Here is what I’m trying to do:
(1) http://www.mydomain.com/ -> https://mydomain.com/
(2) http://mydomain.com/ -> https://mydomain.com/
(3) https://www.mydomain.com -> https://mydomain.com/
Ideally, I would also like to cover the situation if I will ever add more subdomains, to automatically behave like the following (preferably in a generic way that will work for any subdomain I add).
(4) http://sub.mydomain.com/ -> https://sub.mydomain.com/
At this point I’m wondering if it is even possible to create a single .htaccess file that does everything I need, although I have to admit that I understand regexes, but I’m not exactly a mod_rewrite uberpro.
Here are the solutions that I already tried:
-
Force non-www and https via htaccess
- Sort of works, but seems to generate a redirect loop
-
.htaccess redirect www to non-www with SSL/HTTPS
- Works for (1) and (3), but not for (2)
-
htaccess force www to non-www with consideration of http or https
- Redirects to http://mydomain.com/ (without https) for (1)
- Does nothing for (2)
- Redirects to http://mydomain.com/ (without https) for (3)
My SSL certificate covers the www-subdomain, so I’m not looking for a 'untrusted connection' error solution, I’m aware that isn’t possible.
Solution 1:
I found most of the suggestions were not catching when you had something that was https://www.example.com and redirecting to https://example.com.
The following worked for all permutations:
RewriteEngine On
# match any URL with www and rewrite it to https without the www
RewriteCond %{HTTP_HOST} ^(www\.)(.*) [NC]
RewriteRule (.*) https://%2%{REQUEST_URI} [L,R=301]
# match urls that are non https (without the www)
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^(www\.)(.*) [NC]
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Hope this helps someone!
Solution 2:
Put this code in your DOCUMENT_ROOT/.htaccess
file:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{ENV:HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301,NE]
Solution 3:
To Force using HTTPS
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
To Force www to non www
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.bewebdeveloper.com$
RewriteRule ^(.*) http://bewebdeveloper.com/$1 [QSA,L,R=301]