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?
http://
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?
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 .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
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:
Para redirigir las
http
URL 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 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.
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:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[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 ) .
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]
http://www.example.com/...
porque las dos condiciones son implícitamente AND'd. Deberían ser OR en su lugar, es decir. incluya la OR
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.
<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
.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.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
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.
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
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 .htaccess
archivo. 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 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']);
}
.htaccess
archivo?
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]
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
Para redirigir todas las http
solicitudes 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 Redirect
interna if
para redirigir las http
solicitudes https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
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.
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?
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).
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]
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]
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]
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.
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
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 :-))
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.
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
httpd
, no con PHP.