Apache: ¿cómo hacer que las solicitudes http solo entren en https?
.htaccess zend-framework2 (3)
Esta pregunta ya tiene una respuesta aquí:
- http a https a través de .htaccess 8 respuestas
¿Cómo saber si el usuario usa http://ttt.com o http://www.ttt.com , lo redirige a https://www.ttt.com ?
httpd.conf:
<VirtualHost *:80>
ServerName www.ttt.com
ServerAlias ttt.com
DocumentRoot /home/www/html/ttt/public
<Directory /home/www/html/ttt/public>
#Options ExecCGI
#AddDefaultCharset utf-8
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
.htaccess:
RewriteEngine On
############################################
## always send 404 on missing files in these folders
#RewriteCond %{REQUEST_URI} !^/(files)/
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
Aquí tienes: https://wiki.apache.org/httpd/RedirectSSL
Redirigir solicitud a SSL
Digamos que quiere que http://www.example.com/secure/ siempre se envíe a través de SSL (supongo que tanto el vhost normal como el SSL tienen el mismo contenido). Podrías hacer esto al enlazar a la página correcta desde dentro de tus páginas HTML ... pero siempre habrá algún usuario que se cuele de esa manera.
Usando hosts virtuales (usando redirección)
Al usar SSL, con frecuencia tendrá al menos dos hosts virtuales: uno en el puerto 80 para atender solicitudes comunes y otro en el puerto 443 para servir SSL. Si desea redirigir a los usuarios del sitio no seguro al sitio SSL, puede usar una directiva de redirección normal dentro de VirtualHost no seguro:
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>
Cuando redirecciona todo, ni siquiera necesita un DocumentRoot:
NameVirtualHost *:80 <VirtualHost *:80> ServerName www.example.com Redirect permanent / https://secure.example.com/ </VirtualHost> <VirtualHost _default_:443> ServerName secure.example.com DocumentRoot /usr/local/apache2/htdocs SSLEngine On # etc... </VirtualHost>
Nota : el redireccionamiento también se puede usar dentro de archivos .htaccess o para dirigirse a direcciones URL particulares, como en:
Ejemplo:
Redirigir permanente / inicio de sesión https://mysite.example.com/login
Usando mod_rewrite
Si bien se recomienda la solución porque es más simple y segura, también puede usar mod_rewrite para obtener el mismo efecto que se describe aquí: RewriteHTTPToHTTPS
Desde https://httpd.apache.org/docs/trunk/mod/mod_alias.html#redirect :
# Redirect to a URL on a different host Redirect "/service" "http://foo2.example.com/service" # Redirect to a URL on the same host Redirect "/one" "/two"
Si el cliente solicita http://example.com/service/foo.txt , se le indicará que acceda a http://foo2.example.com/service/foo.txt en su lugar. Esto incluye solicitudes con parámetros GET, como http://example.com/service/foo.pl?q=23&a=42 , y se redirigirá a http://foo2.example.com/service/foo.pl. q = 23 y a = 42 . Tenga en cuenta que los POST se descartarán. Solo se complementan los segmentos de ruta completos, por lo que el ejemplo anterior no coincide con una solicitud de http://example.com/servicefoo.txt . Para una concordancia más compleja usando la sintaxis de expresión, omita el argumento ruta URL como se describe a continuación. Alternativamente, para emparejar usando expresiones regulares, vea la directiva RedirectMatch .
Si desea redirigir tanto el sitio www.example.com/*
como el example.com/*
, puede crear dos VirtualHost con diferentes ServerName o puede usar el complemento Rewrite.
Puede hacerlo desde httpd.conf con lo siguiente:
<VirtualHost *:80>
ServerName www.ttt.com
Redirect "/" "https://www.ttt.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.ttt.com
...
...
</VirtualHost>
O desde el archivo .htaccess:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Pruebe el siguiente código en el archivo principal .htaccess:
DirectoryIndex index.php
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]