
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.