Reescribiendo las URL de redireccionamiento de 302 App Server con Apache Proxy en el medio

8

Tengo una configuración extraña. Se parece a esto:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

En el proxy HTTPS (un proxy muy tonto), una URL aparece como https: //proxy.domain.com/app. Luego se canaliza a Apache usando HTTP como es http: //apache.domain.com/app (pasando el host proxy.domain.com). Apache luego hace un túnel localmente la solicitud utilizando el protocolo AJP para ajp: // localhost: 8009 / app /.

A veces, el servidor de aplicaciones quiere redirigir la ruta solicitada. Por ejemplo, redirect / app / to / app / webapp. Entonces, envía un 302 de vuelta a Apache redirigiendo la ruta, probablemente algo así como ajp: // localhost: 8009 / app / webapp. Apache luego reescribe la URL de redireccionamiento a http: //proxy.domain.com/app/webapp. El proxy HTTPS es tonto, por lo que no analiza la redirección y cambia el http a https.

Entonces, me gustaría averiguar si puedo configurar Apache para reescribir la URL de redireccionamiento 302 para enviar al usuario a https.

Aquí está la configuración que tengo hasta ahora en https.conf de Apache:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Intenté usar ProxyPassReverse , pero no he podido descubrir cómo forzarlo a reescribir la URL de redireccionamiento 302 con https en lugar de http.

¿Alguna idea?

Jorge
fuente

Respuestas:

9

Siempre lucho con un problema durante horas antes de rendirme y publicar una pregunta, solo para resolver mi propio problema minutos después de publicar ...

Para aquellos interesados, la solución no es usar ProxyPassReverse , sino más bien usar la directiva Header : te permite jugar con los encabezados salientes. En este caso, puedo capturar el encabezado de respuesta de ubicación y ejecutar una expresión regular para corregir el protocolo de la URL:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Voila!

Si apache se queja, puede ser que mod_headers aún no esté habilitado: a2enmod headers

Jorge
fuente
No es necesario editar los encabezados, busque la solución @wondy para que Tomcat conozca el protocolo LB / RProxy a través de RempteIpValve
Muhammad Hewedy
Usé esta solución. ¡Prefiero hacer alguna configuración de Apache en lugar de hacer que Tomcat haga lo que quiero!
froderik
3

He encontrado otra opción.

Basado en /programming/5741210/handling-x-forwards-proto-in-java-apache-tomcat y Apache ReverseProxyPass redirige a http en lugar de https , parece que algunos servidores reconocen el encabezado X-Fordered-Protocol . Uno puede hacer que Tomcat lo reconozca agregando:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

a server.xml.

wodny
fuente
1
Esta es la mejor solución, por lo tanto, Tomcat está diseñado para trabajar de esta manera
Muhammad Hewedy
Creo que te refieres X-Forwarded-Proto.
Michael Hampton
Estoy bastante seguro de que he usado el "Protocolo" y funcionó. Pero fue en marzo de 2013. Puedo ver que ambas versiones se han utilizado durante algún tiempo. Como puedo ver mientras tanto, se ha escrito un nuevo RFC 7239 (junio de 2014). Probablemente la versión "Proto" ha ganado y ahora es el estándar.
wodny