Cómo redirigir todas las solicitudes HTTP a HTTPS


294

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?


1
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}

24
@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.
Adam

338

Los documentos de Apache recomiendan no usar una reescritura:

Para redirigir las httpURL a https, 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 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.


11
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]

77
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 ) .


1
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

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

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 .
MrWhite

¿Dónde pongo este texto?
Aaron Franke

Sobre el tipo similar de pregunta. ¿Alguien puede ayudar con la siguiente pregunta? stackoverflow.com/questions/59503217/…
appsntech

14

Este es el enfoque de redirección html que funciona pero no el mejor.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Enfoque 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}

copiado de: www.letuslook.org


A donde .htaccessva Además, ese enlace está muerto.
Aaron Franke

8

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]

¿Dónde pongo este texto?
Aaron Franke

6

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 RewriteCond y RewriteRule siguen inmediatamente al RewriteEngine On ya existente.


¿Qué significan L y R?
Aaron Franke

5

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]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828


5

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 :

<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 preguntó si puede hacerlo en un .htaccessarchivo. En ese caso, puede 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 esta redirección, puede declararla 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 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.

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']); 
} 

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í.
maikel

4

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 [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:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]

¿Qué significan L y R?
Aaron Franke

4

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>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security


2

Para redirigir todas las httpsolicitudes a https, puede usar:

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 Redirectinterna ifpara redirigir las httpsolicitudes https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>

2

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.


1

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 obtener más detalles. ¿Cómo redirigir Http a Https?


1
Esta es la solución para cualquier persona que obtenga un "error de redireccionamiento de demasiados" y no pueda cambiar la propiedad allowOverride.
Evochrome

1

A menos que necesite mod_rewrite para otras cosas, usar la directiva Apache core IF 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 garantizar un dominio canónico único sin el prefijo www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

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).



0

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í.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

0
 Redirect 301 / https://example.com/

(funcionó para mí cuando ninguna de las respuestas anteriores funcionó)

Prima:

ServerAlias www.example.com example.com

(https: // www .example.com fijo no encontrado)


0

Esto redirige todas las URL a https y www

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

0

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

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

y establecer la configuración del conector [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Nota: Si ya realizó la configuración https e intenta redirigir, siga el paso 1 solamente.



-1

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.
marc82ch

-1

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:

<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.


-1

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, llamado public_html). Es posible usar RewriteCond% {SERVER_PORT}! ^ 443 $ en lugar de RewriteCond% {HTTPS}! En

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.