security - redireccionar - Cómo redirigir todas las solicitudes HTTP a HTTPS
redireccionar https a https (21)
A menos que necesite mod_rewrite para otras cosas, usar la directiva IF de Apache core es más limpio y rápido:
<If "%{HTTPS} == ''off''">
Redirect permanent / https://yoursite.com/
</If>
Puede agregar más condiciones a la directiva IF, como asegurar un solo dominio canónico sin el prefijo www:
<If "req(''Host'') != ''myonetruesite.com'' || %{HTTPS} == ''off''">
Redirect permanent / https://myonetruesite.com/
</If>
Hay mucha inercia de familiaridad en el uso de mod_rewrite para todo, pero vea si esto funciona para usted.
Más información: https://httpd.apache.org/docs/2.4/mod/core.html#if
Para verlo en acción (inténtelo sin www. O https: //, o con .net en lugar de .com): https://nohodental.com/ (un sitio en el que estoy trabajando).
Estoy intentando redirigir todas las solicitudes HTTP inseguras en mi sitio (por ejemplo, http://www.example.com
) a HTTPS ( https://www.example.com
). Estoy usando PHP por cierto. ¿Puedo hacer esto en .htaccess?
A través de .htaccess Esto ayudará.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www/.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Además, consulte esto para más detalles. ¿Cómo redirigir HTTP a HTTP?
Agregue el siguiente código al archivo .htaccess:
Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]
Donde [nombre de dominio] es el nombre de dominio de su sitio web.
También puede redireccionar carpetas específicas fuera de su nombre de dominio reemplazando la última línea del código anterior con:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Como dije en esta pregunta , sugeriría que evite redirigir todas las solicitudes HTTP a su equivalente de HTTPS a ciegas, ya que puede causar una falsa impresión de seguridad. En su lugar, probablemente debería redirigir la "raíz" de su sitio HTTP a la raíz de su sitio HTTPS y vincular desde allí, solo a HTTPS.
El problema es que si algún enlace o formulario en el sitio HTTPS hace que el cliente envíe una solicitud al sitio HTTP, su contenido estará visible, antes de la redirección.
Por ejemplo, si una de sus páginas servidas a través de HTTPS tiene un formulario que dice <form action="http://example.com/doSomething">
y envía algunos datos que no deberían enviarse de forma clara, el navegador primero enviará la solicitud completa (incluida la entidad, si es un POST) al sitio HTTP primero. La redirección se enviará de inmediato al navegador y, dado que un gran número de usuarios deshabilita o ignora las advertencias, es probable que se ignore.
Por supuesto, el error de proporcionar los enlaces que deberían estar en el sitio HTTPS pero que terminan siendo para el sitio HTTP puede causar problemas tan pronto como se escuche algo en el puerto HTTP en la misma dirección IP que su sitio HTTPS. Sin embargo, creo que mantener los dos sitios como un "espejo" solo aumenta las posibilidades de cometer errores, ya que puede suponer que se corregirá automáticamente al redireccionar al usuario a HTTPS, mientras que a menudo es demasiado tarde. (Hubo discusiones similares en esta pregunta ) .
Descubrí que la mejor manera de https y www en el dominio es
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
El uso del siguiente código en su archivo .htaccess redirige automáticamente a los visitantes a la versión HTTPS de su sitio:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Si tiene un archivo .htaccess existente:
No duplique RewriteEngine On.
Asegúrese de que las líneas que comienzan con RewriteCond y RewriteRule sigan inmediatamente el RewriteEngine On existente.
Encontré un método para forzar que todas las páginas de mi sitio redirigieran de http a las páginas analógicas en https que funcionen para mí.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Este es el enfoque de redireccionamiento HTML que funciona, pero no el mejor.
<meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
Enfoque de PHP
<?php
function redirectTohttps() {
if ($_SERVER[''HTTPS'']!="on") {
$redirect= "https://".$_SERVER[''HTTP_HOST''].$_SERVER[''REQUEST_URI''];
header("Location:$redirect");
}
}
?>
.htaccess approch
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Este es el método adecuado para redirigir HTTP a HTTPS utilizando .htaccess de acuerdo con GoDaddy.com. La primera línea de código es autoexplicativa. La segunda línea de código verifica si HTTPS está desactivado y, de ser así, redirige HTTP a HTTPS ejecutando la tercera línea de código; de lo contrario, se ignora la tercera línea de código.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
Esto funciona para mi:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
y, por ejemplo, http://server/foo?email=someone%40example.com redirige normalmente sin ningún problema. El archivo .htaccess ubicado en la carpeta raíz del sitio web (por ejemplo, denominado public_html). Es posible usar RewriteCond% {SERVER_PORT}! ^ 443 $ en lugar de RewriteCond% {HTTPS}!
Haga todo lo que se explica arriba para la redirección. Simplemente agregue "Seguridad de transporte estricta de HTTP" a su encabezado. Esto evitará al hombre en el ataque medio.
Edite su archivo de configuración de apache (/etc/apache2/sites-enabled/website.conf y /etc/apache2/httpd.conf por ejemplo) y agregue lo siguiente a su VirtualHost:
# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
La documentación de Apache recomienda no usar una reescritura:
Para redireccionar las URL de
http
ahttps
, haga lo siguiente:
<VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost>
Este fragmento de código debe ir al archivo de configuración del servidor principal, no a .htaccess
como se pregunta en la pregunta.
Es posible que este artículo haya aparecido solo después de que la pregunta haya sido formulada y respondida, pero parece ser el camino a seguir.
La mejor solución depende de sus necesidades. Este es un resumen de las respuestas publicadas anteriormente con algún contexto agregado.
Si trabaja con el servidor web Apache y puede cambiar su configuración, siga la documentación de Apache :
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
Pero también preguntaste si puedes hacerlo en un archivo .htaccess
. En ese caso puedes usar el RewriteEngine de Apache:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Si todo funciona bien y desea que los navegadores recuerden este redireccionamiento, puede declararlo como permanente cambiando la última línea a:
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Pero tenga cuidado si puede cambiar de opinión en esta redirección. Los navegadores lo recuerdan durante mucho tiempo y no comprobarán si ha cambiado.
Es posible que no necesite la primera línea RewriteEngine On
dependiendo de la configuración del servidor web.
Si busca una solución PHP, mire la matriz $ _SERVER y la función de encabezado :
if (!$_SERVER[''HTTPS'']) {
header("Location: https://" . $_SERVER[''HTTP_HOST''] . $_SERVER[''REQUEST_URI'']);
}
Lo recomendaría con redireccionamiento 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Me gusta este método de redireccionamiento de http a https. Porque no necesito editarlo para cada sitio.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Para redirigir todas las solicitudes http
a https
, puede utilizar:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
Si mod-rewrite no está habilitado y está en Apache 2.4, también puede usar una directiva Redirect
dentro de if
para redirigir las solicitudes http
a https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Si está utilizando Apache, mod_rewrite es la solución más fácil y tiene mucha documentación en línea sobre cómo hacerlo. Por ejemplo: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Si está utilizando un Elastic Load Balancer de Amazon Web Services que acepta tráfico https y lo enruta a su servidor (es) con http, la forma correcta de redirigir todo el tráfico http a https se describe aquí: https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb
Utilice el encabezado Proto X-Reenviado (contiene http o https) que siempre se incluye en las solicitudes http del equilibrador de carga, como se describe aquí: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html
En el archivo httpd.conf:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
O en su archivo raíz .htaccess:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Bonificación: no intentará redirigir el tráfico http en su máquina de desarrollo local.
Si se encuentra en una situación en la que no puede acceder a la configuración de apache directamente para su sitio, ya que muchas plataformas alojadas todavía están restringidas de esta manera, entonces realmente recomendaría un enfoque de dos pasos. La razón por la que Apache mismo documenta que debe usar sus opciones de configuración primero y principalmente sobre mod_rewrite para HTTP a HTTPS.
Primero, como se mencionó anteriormente, usted configuraría su (s) regla (s) mod_rewrite .htaccess:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Luego, en su (s) archivo (s) PHP (debe hacer esto donde sea apropiado para su situación, algunos sitios canalizarán todas las solicitudes a través de un solo archivo PHP, otros servirán varias páginas según sus necesidades y la solicitud que se realice) ):
<?php if ($_SERVER[''HTTPS''] != ''on'') { exit(1); } ?>
Lo anterior debe ejecutarse ANTES de cualquier código que pueda exponer datos seguros en un entorno no seguro. Por lo tanto, su sitio utiliza la redirección automática a través de HTACCESS y mod_rewrite, mientras que sus scripts aseguran que no se proporcionen resultados cuando no se accede a través de HTTPS.
Supongo que la mayoría de la gente no piensa así, y por eso Apache recomienda que no utilice este método siempre que sea posible. Sin embargo, solo se requiere una comprobación adicional en el extremo de desarrollo para garantizar que los datos de su usuario estén seguros. Esperemos que esto ayude a otra persona que podría tener que considerar el uso de métodos no recomendados debido a las restricciones en nuestros servicios de alojamiento.
Una ventaja diferente de este problema es cuando entra en juego un equilibrador de carga.
La situación es la siguiente: - El tráfico desde el navegador a Load Balancer, y viceversa, es (debería ser) HTTPS - El tráfico entre Load Balancer y el servidor web real es HTTP.
Por lo tanto, todas las variables de solicitud de servidor en PHP o Apache muestran que la conexión es solo HTTP. Y los directorios HTTP y HTTPS en el servidor son los mismos.
El RewriteCondition en la respuesta aprobada no funciona. Da un bucle o simplemente no funciona.
La pregunta es: cómo hacer que esto funcione en un equilibrador de carga.
(O está mal configurado el equilibrador de carga. Que es lo que espero, porque luego puedo pasar el problema a la empresa de alojamiento web :-))
Actualización: Aunque esta respuesta ha sido aceptada hace algunos años, tenga en cuenta que la documentación de Apache ahora recomienda su enfoque. Utilice una Redirect
lugar. Ver esta respuesta
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}