httpd example conf apache web-applications mod-rewrite redirect mod-proxy

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í:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html


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)