.htaccess - pasar - Práctica recomendada: 301 Redireccionamiento de HTTP a HTTPS(dominio estándar)
redireccionar url http a https (2)
Entonces, condensándose, esto se convierte en;
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www/. [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
Déjame saber si ves algún error
He estado buscando la redirección perfecta 301. Pero estoy encontrando tantas soluciones y no sé qué es lo mejor.
Esto es lo que quiero hacer.
- http://domain.tld/ → https://domain.tld/
- http://www.domain.tld/ → https://domain.tld/
- https://www.domain.tld/ → https://domain.tld/
Mejores practicas .htacess?
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www/.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
Este es mi código preferido. Al menos hasta ahora.
Formas alternativas
También encontré muchas otras formas de redireccionar de HTTP
a HTTPS
. Por ejemplo:
1.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Falta un paso? ¿Y no [R=301,L]
aquí?
2.
RewriteCond %{HTTP_HOST} !^www/.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
¿Es generalmente un orden diferente mejor ?
Debo usar
RewriteRule ^(.*)$
en lugar de
RewriteRule (.*)
?
3.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} example/.com$ [NC]
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE]
¿El uso del nombre de dominio completo tiene ventajas de rendimiento? ¿Realmente necesito NE
? ( [R=301,L,NE]
vs. [L,R=301]
)
Por lo tanto, mi pregunta a todos los expertos: ¿Cuál es la mejor forma de redireccionar de HTTP
a HTTPS
y de a
HTTPS://
?
Para comenzar con su solución favorita:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} ^www/.(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
En la parte que maneja las URL no https, está redirigiendo a %{HTTP_HOST}
. Luego, en caso de que su nombre de host comience con "www", debe realizarse una segunda redirección para enviarlo desde https://www.domain.tld/ a https://domain.tld/ que se supone que es su destino final.
Puedes acortar esto usando
RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301]
directamente en la primera regla. La segunda regla solo se aplicaría a los clientes que intentan acceder a https://www.domain.tld
.
La Alternativa 1. no funciona por la misma razón (faltando el caso de que HTTP_HOST
pueda ser www.domain.tld
) y, además, debido a la falta [L,R=301]
. Esto es necesario porque no solo reescribe una URL aquí, como podría hacer en otros tipos de reglas de reescritura. Le está solicitando al cliente que cambie el tipo de su solicitud, por eso le está enviando un código HTTP de 301
.
Con respecto a la parte coincidente de la propia RewriteRule
, debe ser coherente: si desea capturar partes de la URI, utilizará una expresión regular entre paréntesis. Como de hecho lo está usando como un todo aquí, está bien usar una de las alternativas para "cualquier cosa", como ^
y usar %{REQUEST_URI}
más adelante. Si utiliza alguna captura (es decir, (some_regex)
debe hacer referencia a ella en el objetivo utilizando $1
(o lo que sea a la que va a hacer referencia) aquí.
En su tercera alternativa, nuevamente falta www + https.
Puede verificar si https está desactivado o si el nombre de dominio contiene una "www" en una regla, sin embargo, las condiciones de reescritura están implícitamente relacionadas con "y".
Por lo que debe leer:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www/. [NC]
RewriteRule ^ https://domain.tld%{REQUEST_URI} [R=301,L,NE]
El NE es necesario para pasar cosas como los parámetros GET y similares a la nueva URI sin cambios, ver: