Estoy tratando de 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?
Puede (y debe) hacer esto a través de su httpd, no con PHP.
drudge
2
@jnpcl, aunque estoy de acuerdo con que la solución httpd es mejor que la solución basada en PHP, no creo que una redirección sistemática sea una buena práctica en general. Si desea redirigir a sus usuarios a HTTPS en todo momento, envíelos allí desde el "punto de entrada" (el primer enlace a su sitio), no lo haga a mitad de camino, lo que podría filtrar algunos datos que usted pensaría está protegido (si no nota esa redirección instantánea).
Bruno
@Bruno: Estaba pensando más en la línea de solicitudes http duplicadas, el potencial de cadenas de consulta perdidas y la posibilidad de que el usuario ingrese manualmentehttp://
drudge el
@jnpcl ese es un buen punto de hecho. Simplemente sugería que, si bien las personas tienden a pedir este tipo de redireccionamiento para mejorar la seguridad de su sitio, a menudo, en realidad no lo mejora (ya que no evita que la misma solicitud pase primero por HTTP) .
Bruno
8
@outis: el primer enlace que publicaste es esta pregunta.
Mei
Respuestas:
305
Actualización: aunque esta respuesta se aceptó hace unos años, tenga en cuenta que la documentación de Apache ahora recomienda su enfoque . Use un Redirecten su lugar. Mira esta respuesta .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
@Cat, como decía en mi respuesta / comentarios, si está tratando de "redirigir todos los HTTP [...] inseguros a HTTPS", este enfoque no hará que esas solicitudes sean seguras, solo hará que el navegador las haga dos veces, una vez inseguro y una vez seguro.
Bruno
13
Lo que realmente debería estar haciendo es usar HSTS en concierto con esto.
Reese Moore
3
Esto puede ser un error en mi versión de apache (2.4.6 como está empaquetado en Centos 7), pero esto tiene problemas para mí en ciertas URL. Por ejemplo, http://server/foo?email=someone%40example.comredirige a, https://server/foo?email=someone%2540example.comes decir, el signo "@" se cita la URL dos veces . Usar el método en la respuesta de @ ssc no tiene este problema.
Psmears
2
Respuesta incorrecta. Solo redirigirá la URL base, no las URL en subcarpetas. RewriteRule (. *) Https: //% {HTTP_HOST}% {REQUEST_URI} [R = 301, L] es la respuesta correcta
FredTheWebGuy
77
No necesariamente lo recomiendan:In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Esta debería ser la respuesta actual. Pero, ¿qué pasa exactamente en la "configuración SSL"? Un ejemplo completo sería realmente útil.
Ben
66
@Ben: esa es una pregunta diferente que está ampliamente documentada en línea; Por cierto, ayer agregué un ejemplo casi completo: serverfault.com/q/597012/26210 que podría darle una idea de lo que ocurre en la configuración SSL
ssc
46
Esta es una gran pista. Pero en el documento de Apache también se menciona: "En el caso de la redirección de http a https, el uso de RewriteRule sería apropiado si no tiene acceso al archivo de configuración del servidor principal y está obligado a realizar esta tarea en un archivo .htaccess en su lugar ". Cuál es el caso para mí ...
peter_the_oak
44
@ user1844933 Si usa la permanentpalabra clave, el efecto es el mismo (el navegador recibe una redirección 301). Por ejemplo:Redirect permanent "/" "https://example.com"
BeetleJuice
2
@Whitecat En Centos 6 el archivo está ubicado en /etc/httpd/conf/httpd.conf
dstonek
141
Recomiendo con la redirección 301:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
gracias, esto funciona para mí, la respuesta aceptada no ... probablemente debido a la falta de[L]
billynoah
1
Sí. Esta es la respuesta correcta, ya que también rutas de todas las URL de las subcarpetas, también
FredTheWebGuy
¿Está esto en el nivel superior del archivo htaccess?
CodyBugstein
1
@CodyBugstein Ahí es donde siempre lo coloco, y siempre funciona.
Daan van den Bergh
3
Todas las respuestas carecen de una cosa: cualquier código para la redirección debe colocarse justo al comienzo de su archivo .htaccess, ANTES de cualquier otra cosa, si desea que todas las páginas se redirijan a https.
Vadim Anisimov
35
Como decía en esta pregunta , le sugiero que evite redirigir todas las solicitudes HTTP a su equivalente HTTPS a ciegas, ya que puede causarle 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 será 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 una POST) al sitio HTTP primero. La redirección se enviará inmediatamente 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 ser al sitio HTTPS pero que terminan siendo para el sitio HTTP puede causar problemas tan pronto como 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 redirigir al usuario a HTTPS, mientras que a menudo es demasiado tarde. (Hubo discusiones similares en esta pregunta ) .
Al tomar la decisión de servir un sitio completo como HTTPS, este tipo de redirección tiene sentido. No quiero que un usuario obtenga un 403 porque especificaron http para su página de destino. Estoy de acuerdo si alguien SÍ especifica http en un enlace y lo implementa en producción que ES malo. DEBE ser atrapado durante la prueba, incluso con la redirección en su lugar. No me gusta el argumento "podría" porque este "podría" suceder sin la redirección en su lugar. Los síntomas son los mismos cuando se realiza la prueba en un navegador seguro, excepto después de confirmar que se envía el mensaje en claro, se redirige en lugar de recibir un 403.
Derek Litz
Sí, veo el beneficio de fallar mucho si alguien coloca erróneamente http en una acción de formulario, pero ser indulgente con las URL escritas parece más importante en la mayoría de los casos.
Daniel Lubarov
44
@Daniel, estoy de acuerdo en que es útil ser indulgente cuando los usuarios escriben la URL. Diría que es uno de los casos en los que es mejor tener esta característica desactivada durante el desarrollo / prueba, pero activarla en producción (o en las últimas etapas de desarrollo / prueba).
Bruno
¿Por qué no hacer http a https en dns?
Muhammad Umer
1
@MuhammadUmer, porque esto no tiene nada que ver con DNS. Utilizarían el mismo nombre de host en general, pero incluso con un nombre de host diferente, aún necesitaría cambiar el protocolo y el puerto.
Bruno
18
Descubrí que la mejor manera para https y www en el dominio es
Esto no redirigirá http://www.example.com/...porque las dos condiciones son implícitamente AND'd. Deberían ser OR en su lugar, es decir. incluya la ORbandera en la primera condición (y recuerde escapar de los puntos literales en la expresión regular). Pero si está implementando HSTS, entonces no desea redirigir a HTTPS y www en una sola redirección, primero debe redirigir a HTTPS .
Este es el método adecuado para redirigir HTTP a HTTPS utilizando .htaccess según GoDaddy.com. La primera línea de código se explica por sí misma. 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]
Pero tenga cuidado si puede cambiar de opinión sobre esta redirección. Los navegadores lo recuerdan durante mucho tiempo y no verifican si ha cambiado.
Es posible que no necesite la primera línea RewriteEngine Ondependiendo de la configuración del servidor web.
Parece que la documentación de Apache se recomienda contra la ruta Reescribir. ¿Qué pasa con Redirect? ¿Qué más puede ir en un .htaccessarchivo?
Aaron Franke
Sí, se prefiere Redirect y se puede usar en .htaccess. Pero no puede agregar la condición para redirigir solo el tráfico http a https. Redirige también https -> bucle de redireccionamiento infinito. Lo enumeré en la directiva VirtualHost utilizada para http (puerto 80) anterior, .htaccess no es compatible con esa directiva y, por lo tanto, Redirect no se puede utilizar aquí.
Haga todo lo que se explica arriba para la redirección. Simplemente agregue "HTTP Strict Transport Security" a su encabezado. Esto evitará al hombre en el medio ataque.
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>
Si se encuentra en una situación en la que no puede acceder a la configuración de apache directamente para su sitio, que muchas plataformas alojadas aún están restringidas de esta manera, entonces realmente recomendaría un enfoque de dos pasos. La razón por la cual los propios Apache documentan que debe usar sus opciones de configuración en primer lugar sobre mod_rewrite para HTTP a HTTPS.
Primero, como se mencionó anteriormente, configuraría su (s) regla (s) .htaccess mod_rewrite:
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 dependiendo de sus necesidades y la solicitud que se haga ):
<?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 proporcione salida cuando no se accede a través de HTTPS.
Supongo que la mayoría de la gente no piensa así, por lo que Apache recomienda que no use este método siempre que sea posible. Sin embargo, solo se necesita una verificación adicional en el final del desarrollo para garantizar que los datos de su usuario estén seguros. Esperemos que esto ayude a alguien más que deba considerar el uso de métodos no recomendados debido a restricciones en nuestros servicios de alojamiento final.
Si desea hacerlo desde el servidor Tomcat, siga los pasos a continuación.
En un servidor HTTP Apache Tomcat (8.5.x) independiente, cómo puede configurarlo para que, si un usuario escribe www.dominio.com, se reenvíe automáticamente al sitio https (www.dominio.com).
El método de 2 pasos para incluir lo siguiente en su [Tomcat_base] /conf/web.xml antes de la etiqueta de cierre
Una ventaja diferente de este problema es cuando entra en juego un Load Balancer.
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 WebServer real es HTTP.
Entonces, todas las variables de solicitud del 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.
La 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 el equilibrador de carga está configurado incorrectamente? Que es lo que espero porque entonces puedo trasladar el problema a la empresa WebHosting :-))
La redirección solo tendría que suceder en el equilibrador de carga. Dependiendo del tipo de equilibrador de carga, esto debería ser posible en la configuración, o es una instancia de Apache en sí, donde la respuesta aceptada funcionaría. Simplemente no lo hagas en los nodos individuales.
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, llamado public_html). Es posible usar
RewriteCond% {SERVER_PORT}! ^ 443 $ en lugar de RewriteCond% {HTTPS}! En
httpd
, no con PHP.http://
Respuestas:
Actualización: aunque esta respuesta se aceptó hace unos años, tenga en cuenta que la documentación de Apache ahora recomienda su enfoque . Use un
Redirect
en su lugar. Mira esta respuesta .fuente
http://server/foo?email=someone%40example.com
redirige a,https://server/foo?email=someone%2540example.com
es decir, el signo "@" se cita la URL dos veces . Usar el método en la respuesta de @ ssc no tiene este problema.In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
Los documentos de Apache recomiendan no usar una reescritura:
Este fragmento debe ir al archivo de configuración del servidor principal, no al
.htaccess
como se le preguntó en la pregunta.Este artículo podría haber aparecido solo después de que se hizo y respondió la pregunta, pero parece ser el camino actual a seguir.
fuente
permanent
palabra clave, el efecto es el mismo (el navegador recibe una redirección 301). Por ejemplo:Redirect permanent "/" "https://example.com"
Recomiendo con la redirección 301:
fuente
[L]
Como decía en esta pregunta , le sugiero que evite redirigir todas las solicitudes HTTP a su equivalente HTTPS a ciegas, ya que puede causarle 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 será 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 una POST) al sitio HTTP primero. La redirección se enviará inmediatamente 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 ser al sitio HTTPS pero que terminan siendo para el sitio HTTP puede causar problemas tan pronto como 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 redirigir al usuario a HTTPS, mientras que a menudo es demasiado tarde. (Hubo discusiones similares en esta pregunta ) .
fuente
Descubrí que la mejor manera para https y www en el dominio es
fuente
http://www.example.com/...
porque las dos condiciones son implícitamente AND'd. Deberían ser OR en su lugar, es decir. incluya laOR
bandera en la primera condición (y recuerde escapar de los puntos literales en la expresión regular). Pero si está implementando HSTS, entonces no desea redirigir a HTTPS y www en una sola redirección, primero debe redirigir a HTTPS .Este es el enfoque de redirección html que funciona pero no el mejor.
Enfoque PHP
.htaccess Approch
copiado de: www.letuslook.org
fuente
.htaccess
va Además, ese enlace está muerto.Me gusta este método de redireccionamiento de http a https. Porque no necesito editarlo para cada sitio.
fuente
El uso del siguiente código en su archivo .htaccess redirige automáticamente a los visitantes a la versión HTTPS de su sitio:
Si tiene un archivo .htaccess existente:
No duplique RewriteEngine On.
Asegúrese de que las líneas que comienzan RewriteCond y RewriteRule siguen inmediatamente al RewriteEngine On ya existente.
fuente
Este es el método adecuado para redirigir HTTP a HTTPS utilizando .htaccess según GoDaddy.com. La primera línea de código se explica por sí misma. 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.
https://www.godaddy.com/help/redirect-http-to-https-automatically-8828
fuente
La mejor solución depende de sus requisitos. 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 :
Pero también preguntó si puede hacerlo en un
.htaccess
archivo. En ese caso, puede usar el RewriteEngine de Apache :Si todo funciona bien y desea que los navegadores recuerden esta redirección, puede declararla como permanente cambiando la última línea a:
Pero tenga cuidado si puede cambiar de opinión sobre esta redirección. Los navegadores lo recuerdan durante mucho tiempo y no verifican 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 :
fuente
.htaccess
archivo?Agregue el siguiente código al archivo .htaccess:
Donde [su nombre de dominio] es el nombre de dominio de su sitio web.
También puede redirigir carpetas específicas de su nombre de dominio reemplazando la última línea del código anterior con:
fuente
Haga todo lo que se explica arriba para la redirección. Simplemente agregue "HTTP Strict Transport Security" a su encabezado. Esto evitará al hombre en el medio ataque.
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
fuente
Para redirigir todas las
http
solicitudes ahttps
, puede usar:Si mod-rewrite no está habilitado y está en Apache 2.4, también puede usar una directiva
Redirect
internaif
para redirigir lashttp
solicitudeshttps
.Apache 2.4.
fuente
Si se encuentra en una situación en la que no puede acceder a la configuración de apache directamente para su sitio, que muchas plataformas alojadas aún están restringidas de esta manera, entonces realmente recomendaría un enfoque de dos pasos. La razón por la cual los propios Apache documentan que debe usar sus opciones de configuración en primer lugar sobre mod_rewrite para HTTP a HTTPS.
Primero, como se mencionó anteriormente, configuraría su (s) regla (s) .htaccess mod_rewrite:
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 dependiendo de sus necesidades y la solicitud que se haga ):
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 proporcione salida cuando no se accede a través de HTTPS.
Supongo que la mayoría de la gente no piensa así, por lo que Apache recomienda que no use este método siempre que sea posible. Sin embargo, solo se necesita una verificación adicional en el final del desarrollo para garantizar que los datos de su usuario estén seguros. Esperemos que esto ayude a alguien más que deba considerar el uso de métodos no recomendados debido a restricciones en nuestros servicios de alojamiento final.
fuente
A través de .htaccess Esto ayudará.
Además, consulte esto para obtener más detalles. ¿Cómo redirigir Http a Https?
fuente
A menos que necesite mod_rewrite para otras cosas, usar la directiva Apache core IF es más limpio y rápido:
Puede agregar más condiciones a la directiva IF, como garantizar un dominio canónico único sin el prefijo www:
Hay mucha inercia de familiaridad al usar 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 (intente sin www. O https: //, o con .net en lugar de .com): https://nohodental.com/ (un sitio en el que estoy trabajando).
fuente
lleve este código a usted .htaccess redirigir HTTP a HTTPS automáticamente
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
fuente
Encontré un método para forzar el redireccionamiento de todas las páginas de mi sitio de http a análogo de páginas en https que funcionan para mí.
fuente
(funcionó para mí cuando ninguna de las respuestas anteriores funcionó)
Prima:
(https: // www .example.com fijo no encontrado)
fuente
Esto redirige todas las URL a https y www
fuente
Si desea hacerlo desde el servidor Tomcat, siga los pasos a continuación.
En un servidor HTTP Apache Tomcat (8.5.x) independiente, cómo puede configurarlo para que, si un usuario escribe www.dominio.com, se reenvíe automáticamente al sitio https (www.dominio.com).
El método de 2 pasos para incluir lo siguiente en su [Tomcat_base] /conf/web.xml antes de la etiqueta de cierre
y establecer la configuración del conector [Tomcat_base] /conf/server.xml:
Nota: Si ya realizó la configuración https e intenta redirigir, siga el paso 1 solamente.
fuente
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
fuente
Una ventaja diferente de este problema es cuando entra en juego un Load Balancer.
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 WebServer real es HTTP.
Entonces, todas las variables de solicitud del 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.
La 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 el equilibrador de carga está configurado incorrectamente? Que es lo que espero porque entonces puedo trasladar el problema a la empresa WebHosting :-))
fuente
Si está utilizando un Elastic Load Balancer de Amazon Web Services que acepta el tráfico https y lo enruta a sus servidores con http, aquí se describe la forma correcta de redirigir todo el tráfico http a https: https://aws.amazon. com / premiumsupport / knowledge-center / redirect-http-https-elb
Utilice el encabezado X-Fordered-Proto (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- rewards-headers.html
En el archivo httpd.conf:
O en su archivo raíz .htaccess:
Bonificación: no intentará redirigir el tráfico http en su máquina de desarrollo local.
fuente
Esto funciona para mi:
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, llamado public_html). Es posible usar RewriteCond% {SERVER_PORT}! ^ 443 $ en lugar de RewriteCond% {HTTPS}! En
fuente