
Estoy tratando de reducir la cantidad de encadenamiento de redireccionamiento 301 en mi servidor, por lo que me gustaría combinar un subdominio con un redireccionamiento que no sea www (excepto cuando el subdominio esté dev
) con un redireccionamiento HTTP a HTTPS (usando %{HTTP:X-Forwarded-Proto}
) ya que la instancia está detrás. un equilibrador de carga.
Esto es lo que tengo hasta ahora en mi .htaccess
:
# move http to https
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=301]
# Remove leading www
RewriteCond %{HTTP_HOST} ^www.example.net [NC]
RewriteRule ^(.*)$ https://example.net/$1 [R=301,L]
Hay tres problemas con mi implementación actual:
Una solicitud
http://www.example.net
tendrá dos redirecciones.Como la mayoría de los ejemplos de redireccionamiento de www a no www en este sitio, no redirigirá
ww.
,wwww.
por lo que mis análisis tienen muchos subdominios mal escritos que no han sido redirigidos.Me gustaría excluir el
dev.
subdominio de la redirección, asíhttp://dev.example.net
como suhttps
hermano, como lo usodev.
para el desarrollo y la puesta en escena de lanzamiento.
¿Cómo debo hacer para combinar esto?
Respuesta1
1) Una solicitud
http://www.example.net
tendrá dos redirecciones.
Esto se puede resolver simplemente invirtiendo las dos reglas. Luego www.example.net
se redirige a HTTPS en la primera redirección, por lo que no es necesario activar la redirección de HTTP a HTTPS.
(Sin embargo, esto supone que usted no tiene intención de implementarHSTS- en cuyo caso deberás mantenerlos como dos redireccionamientos ya que redirige a HTTPS en el mismo nombre de hostprimeroes un requisito.)
2) Como la mayoría de los ejemplos de redireccionamiento de www a no www en este sitio, no redirigirá
ww.
,wwww.
por lo que mis análisis tienen muchos subdominios mal escritos que no han sido redirigidos.
Normalmente, las solicitudes a ww.
subdominios wwww.
simplemente no se resuelven, por lo que esto no suele ser un problema. Para que esto funcione tienes que tener configurado uncomodínsubdominio en DNS y configuré el servidor para aceptar dichas solicitudes.
Pero esto se puede solucionar modificando la expresión regular (fragmento) de ^www\.
a ^w{2,4}\.
.
3) Me gustaría excluir el
dev.
subdominio de la redirección, asíhttp://dev.example.net
como suhttps
hermano, como lo usodev.
para el desarrollo y la puesta en escena de lanzamiento.
Esto solo se aplica a la regla HTTP a HTTPS, por lo que aquí se puede aplicar una condición adicional para excluir los nombres de host que comienzan con dev.
.
Reuniendo los puntos anteriores, intente lo siguiente:
# Remove leading ww, www or wwww (and redirect to HTTPS)
RewriteCond %{HTTP_HOST} ^w{2,4}\.example\.net [NC]
RewriteRule (.*) https://example.net/$1 [R=301,L]
# Move http to https (except dev subdomain)
RewriteCond %{HTTP:Host} !^dev\. [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP:Host}%{REQUEST_URI} [R=301,L]
¿Mantuve su uso del HTTP:Host
mismo (para acceder al Host
encabezado de solicitud HTTP) en caso de que este sea un requisito del balanceador de carga? De lo contrario, es más común utilizar HTTP_HOST
aquí la variable del servidor.
El !
prefijo en elPatrónCond(es decir, !^dev\.
) niega la expresión regular, por lo que la condición es exitosa cuando lo Host
hacenoEmpezar con dev.
. (¿Supongo que www.dev.
no es nada?)
(.*)
es lo mismo que ^(.*)$
ya que la expresión regular es codiciosa por defecto.
Deberá borrar la memoria caché de su navegador antes de realizar la prueba. Es recomendable probar primero con redireccionamientos 302 (temporales) para evitar problemas de almacenamiento en caché.
Respuesta2
# Remove leading www, always using https regardless of the current URL scheme
RewriteCond %{HTTP_HOST} ^w{2,4}.example.net(?::|$) [NC,NV]
RewriteRule .* https://example.net%{REQUEST_URI} [L,R=301]
# move http to https, except for dev.example.net
RewriteCond %{HTTP:X-Forwarded-Proto} =http [NC,NV]
RewriteCond %{HTTP_HOST} !^dev.example.net(?::|$) [NC,NV]
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
- Se agregó el indicador
NC
(nocase
) a laX-Forwarded-Proto
condición, ya que su valor parecía no tener importancia entre mayúsculas y minúsculas, es decirHTTP = Http = hTTp = http
. Eres libre de eliminar esto. - Se agregó el indicador
NV
(novary
) a laX-Forwarded-Proto
condición para ocultarla delVary
encabezado de respuesta. Nuevamente, puede eliminar esto, especialmente si no es el caso (el proxy inverso lo filtra automáticamente de todos modos antes de enviarlo al cliente) o si es necesario para un comportamiento correcto del almacenamiento en caché (el caché no distinguehttp
elhttps
contenido). - Se agregó el indicador
NV
(novary
) a laHost
condición del encabezado para ocultarlo delVary
encabezado de respuesta. También puedes eliminar esto si tienes un servidor de caché roto. - Hizo que el
RewriteRule
orden de las banderas fuera consistente (L,R=301
yR=301,L
son esencialmente iguales). - Se ha impedido
www.example.net.but.not.actually.yours.com
que se reconozca, pero aún permite, por ejemplowww.example.net:443
. - Úselo constantemente
%{REQUEST_URI}
como sustitución. - Reconocer también
ww
ywwww
.