Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Httpd Wiki" for change 
notification.

The following page has been changed by megaspaz:
http://wiki.apache.org/httpd/ScratchPad/RedirectSSL

The comment on the change is:
Moved here to discuss. askapache.com has "Gospel" info and no explanation.

New page:
= Redirect Request To SSL =
Let's say you want http://www.domain.com/secure/ to always be sent over SSL (I 
presume here that both the normal and the SSL vhost have the same content). You 
could do this by linking to the correct page from within your HTML pages... but 
there will always be some user who will sneak by it that way.


== Using mod_rewrite ==
{{{
<Location /secure>
   RewriteEngine On
   ReWriteCond %{HTTPS} !=on
   RewriteRule .* https://%{HTTP_HOST}:443%{REQUEST_URI} [QSA,R=permanent,L]
</Location>
}}}

'''Note: This snippet can also be used inside a directory or vhost container.'''

Make sure you have loaded 
[http://httpd.apache.org/docs/trunk/mod/mod_rewrite.html mod_rewrite] and have 
it enabled.

{{{
   LoadModule rewrite_module modules/mod_rewrite.so
   RewriteEngine On
}}}

== Using virtual hosts ==

When using SSL, you will frequently have at least two virtual hosts: one on 
port 80 to serve ordinary requests, and one on port 443 to serve SSL.  If you 
wish to redirect users from the non-secure site to the SSL site, you can use an 
ordinary [http://httpd.apache.org/docs/trunk/mod/mod_alias.html#redirect 
Redirect] directive inside the non-secure VirtualHost:

{{{
NameVirtualHost *:80
<VirtualHost *:80>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   Redirect permanent /secure https://mysite.example.com/secure
</VirtualHost>

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>
}}}



= Improved Redirect To SSL =
''source: 
[http://www.askapache.com/2006/htaccess/apache-ssl-in-htaccess-examples.html 
askApache.com]''
{{{
#If server does not have mod_ssl or mod_rewrite, deny
[IfModule !mod_rewrite.c]
[IfModule !mod_ssl.c]
deny from all
[/IfModule]
[/IfModule]
}}}


== Most Secure SSL Redirect Method '''(doesn't require mod_rewrite!)''' ==
This will check to make sure that the connection is using SSL, or it will fail. 
This works regardless of if you are serving SSL on port 443, 80, 81, etc. This 
is the most secure setting for SSL logins.

This also fixes having to type in the username and password twice by requiring 
the HTTP_HOST to match the HTTP_HOST that your SSL certificate is set-up for, 
in the case above, the SSL is for askapache.com not www.askapache.com

So if either of those 2 checks fail '''(!SSL or !correct domain)''' than the 
(403) ErrorDocument directive issues a 302 Found, Location: 
https://askapache.com which forces the client to connect to the correct 
location. 
{{{
[IfModule mod_ssl.c]
SSLOptions +StrictRequire
SSLRequireSSL
SSLRequire %{HTTP_HOST} eq "askapache.com"
ErrorDocument 403 https://askapache.com
[/IfModule]
}}}


== Rewrite non-SSL requests to SSL '''(doesn't require mod_ssl!)''' ==
{{{
[IfModule !mod_rewrite.c]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
[/IfModule]
}}}
''NOTE'': The ''HTTPS'' variable is always present, even if mod_ssl isn’t 
loaded!


== Redirect everything served on port 80 to SSL ==
{{{
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
}}}


== Changing to SSL or non-SSL using relative URLs ==
{{{
RewriteRule ^/(.*):SSL$   https://%{SERVER_NAME}/$1 [QSA,R,L]
RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [QSA,R,L]
}}}
This lets you use URIs like:
{{{
/document.html:SSL    --> https://askapache.com/document.html
/document.html:NOSSL  --> http://askapache.com/document.html
}}}

Original edited by John Crown

Reply via email to