Apache reescribe cualquier subdominio excepto uno en https que no sea www

Apache reescribe cualquier subdominio excepto uno en https que no sea www

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:

  1. Una solicitud http://www.example.nettendrá dos redirecciones.

  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.

  3. Me gustaría excluir el dev.subdominio de la redirección, así http://dev.example.netcomo su httpshermano, como lo uso dev.para el desarrollo y la puesta en escena de lanzamiento.

¿Cómo debo hacer para combinar esto?

Respuesta1

1) Una solicitud http://www.example.nettendrá dos redirecciones.

Esto se puede resolver simplemente invirtiendo las dos reglas. Luego www.example.netse 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.netcomo su httpshermano, como lo uso dev.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:Hostmismo (para acceder al Hostencabezado 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_HOSTaquí 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 HosthacenoEmpezar 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]
  1. Se agregó el indicador NC( nocase) a la X-Forwarded-Protocondición, ya que su valor parecía no tener importancia entre mayúsculas y minúsculas, es decir HTTP = Http = hTTp = http. Eres libre de eliminar esto.
  2. Se agregó el indicador NV( novary) a la X-Forwarded-Protocondición para ocultarla del Varyencabezado 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 distingue httpel httpscontenido).
  3. Se agregó el indicador NV( novary) a la Hostcondición del encabezado para ocultarlo del Varyencabezado de respuesta. También puedes eliminar esto si tienes un servidor de caché roto.
  4. Hizo que el RewriteRuleorden de las banderas fuera consistente ( L,R=301y R=301,Lson esencialmente iguales).
  5. Se ha impedido www.example.net.but.not.actually.yours.comque se reconozca, pero aún permite, por ejemplo www.example.net:443.
  6. Úselo constantemente %{REQUEST_URI}como sustitución.
  7. Reconocer también wwy wwww.

información relacionada