apache - example - Conservar la URL de solicitud original en mod_proxy redirect
ubuntu apache proxy reverse (3)
Estoy ejecutando una aplicación web en un contenedor de servlets (puerto 8080) en un entorno al que se puede acceder desde internet (externo) y desde la compañía interna (intenal), por ej.
http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication
Las solicitudes entrantes (externas / internas) se redirigen al contenedor de servlets utilizando un servidor http apache con mod_proxy. La configuración se ve así:
ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /MyApplication http://localhost:8080/MyApplication
Ahora estoy enfrentando el problema de que algunas respuestas de MyApplication dependen de la URL de solicitud original. Concreto: un documento WSDL se proporcionará con un elemento que tiene un elemento schemaLocation="<RequestUrl>?xsd=MyApplication.xsd"
.
Con mi configuración actual, siempre se ve como
<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>
pero debería ser
External Request: <xs:import namespace="..." schemaLocation="http://external.foo.bar/MyApplication?xsd=MyApplication.xsd"/>
Internal Request: <xs:import namespace="..." schemaLocation="http://internal.foo.bar/MyApplication?xsd=MyApplication.xsd"/>
Supongo que este es un requisito común. Pero como no soy un experto en la configuración del servidor http de Apache y sus módulos, me gustaría que alguien brinde alguna ayuda (detallada).
¡Gracias por adelantado!
Aquí hay otra alternativa si desea conservar el nombre de host original y el nombre de servidor proxy.
Si está utilizando mod_proxy, deshabilite ProxyPreserveHost
en la configuración de Apache. Para la mayoría de los servidores proxy, incluido mod_proxy, lea el encabezado X-Forwarded-Host
en su aplicación. Esto identifica el encabezado Host original proporcionado por la solicitud HTTP.
Puede leer sobre los encabezados mod_proxy (y otros posibles servidores proxy estándar) establecidos aquí:
Debería poder hacer un mod_rewrite en apache para codificar la URL completa como un parámetro de consulta, o quizás parte del fragmento. Lo fácil que esto puede ser depende de si puede usar uno u otro como parte de sus consultas entrantes.
Por ejemplo, http://external.foo.bar/MyApplication
podría reescribirse en http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication
que luego pasa al ProxyPass y luego despojado.
Un poco de truco, sí, y tal vez un poco difícil conseguir que la reescritura y el proxy funcionen en el orden correcto y no interfieran entre sí, pero parece que debería funcionar.
Si está ejecutando Apache> = 2.0.31, puede intentar configurar la directiva ProxyPreserveHost
como se describe here .
Esto debería pasar el encabezado Host original a través de mod_proxy en su aplicación, y normalmente la URL de solicitud se reconstruirá allí (en su contenedor Servlet) usando el encabezado Host, por lo que la ubicación del esquema debe compilarse utilizando las informaciones de host y ruta desde "antes" el proxy.
(Publicado aquí también por el bien de la integridad)