Cómo redirigir el tráfico a http

Cómo redirigir el tráfico a http

Tengo un servidor Apache bajo un proxy que puede ejecutar HTTPS. En lugar de enviar el encabezado HTTPS=on, envía HTTP_X_FORWARDED_PROTO=https.

Quiero escribir una regla .htaccess que redirija todas las solicitudes de https a http a menos que la URL sea /usuario/login.

Lo que se me ocurrió es alrededor de estas líneas (que hace un bucle infinito):

RewriteCond %{HTTP:http_x_forwarded_proto} !http
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Respuesta1

El problema con su regla de redireccionamiento probablemente sea que esté duplicando el prefijo "http_". Esto no debería ser necesario. Si tiene un proxy inverso frente a su servidor (como F5 o nginx), el encabezado será "X-Forwarded-Proto" o, algunas veces, "X-Forwarded_Proto". Para hacer referencia a estos en una regla de reescritura, utilice %{HTTP:Name-Of-Header} (no se distingue entre mayúsculas y minúsculas).

Para obtener la reescritura más sólida que funcione en todas las situaciones, use algo como esto:

# Make sure all SSL pages for dot-com are redirected to HTTP.
RewriteCond %{SERVER_PORT} 443 [OR]
RewriteCond %{HTTPS} on [OR]
RewriteCond %{HTTP:X-Forwarded-Proto} https [OR]
RewriteCond %{HTTP:X-Forwarded_Proto} https
RewriteRule (.*) http://%{HTTP_HOST}/$1 [R=301,L]

Se proporcionan más detalles sobre el uso de encabezados en RewriteCond en elDocumentación de Apache mod_rewrite.

Respuesta2

Creo que el problema con tu condición inicial es que tienes !http en lugar de !=http. Eso puede arreglar el bucle infinito.

    RewriteEngine On
    RewriteCond %{HTTP:http_x_forwarded_proto} !=http
    RewriteCond %{REQUEST_URI} !^/user/login.*
    RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Esto debería tomar cualquier solicitud https que no sea /user/login y reescribirla en http. Sin embargo, estoy seguro de que hay una forma más elegante de hacer esto. Podrías deshacerte de RewriteCond %{HTTP:http_x_forwarded_proto} !=http y probablemente funcionaría igual de bien, por ejemplo, ya que debería tomar cualquier solicitud que se le entregue que no incluya /user/login y redirigirla a http.

información relacionada