I am trying to force SSL with .htaccess
on a shared host. This means there I only have access to .htaccess
and not the main VirtualHost
configuration. I know you can put a rule in the VirtualHost
config file to force SSL which will be picked up there (and acted upon first), preventing double authentication, but I can not get to that.
Here is the progress I have made:
Config 1
This works pretty well but it does force double authentication if you visit http://example.com
- once for http and then once for https. Once you are logged in, it automatically redirects http://example.com/page1.html
to the https coutnerpart just fine:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteEngine on
RewriteCond %{HTTP_HOST} !(^www\.example\.com*)$
RewriteRule (.*) https://www.example.com$1 [R=301,L]
AuthName "Locked"
AuthUserFile "/home/.htpasswd"
AuthType Basic
require valid-user
Config 2
If I add the following to the top of the file, it works a lot better in that it will switch to SSL before prompting for the password:
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "example.com"
ErrorDocument 403 https://example.com
It is clever how it will use the SSLRequireSSL
option and the ErrorDocument 403
to redirect to the secure version of the site. My only complaint is that if you try to access http://example.com/page1.html
, it will redirect to https://example.com/
So it is forcing SSL without a double-login, but it is not properly forwarding non-SSL resources to their SSL counterparts.
Regarding the first config, Insyte mentioned "using mod_rewrite to perform a simple redirect is a bit of overkill. Use the Redirect directive instead. It's possible this may even fix your problem, as I believe mod_rewrite rules are some of the last directives to be processed, just before the file is actually grabbed from the filesystem"
I have not had no such luck on finding a force-ssl config option with the redirect directive and so have been unable to test this theory.