web-dev-qa-db-fra.com

Conserver l'URL de demande d'origine sur la redirection mod_proxy

J'exécute une application Web sur un conteneur de servlet (port 8080) dans un environnement accessible depuis Internet (externe) et depuis l'entreprise à l'intérieur (intenal), par ex.

http://external.foo.bar/MyApplication
http://internal.foo.bar/MyApplication

Les demandes entrantes (externes/internes) sont redirigées vers le conteneur de servlet à l'aide d'un serveur Apache http avec mod_proxy. La configuration ressemble à ceci:

ProxyPass /MyApplication http://localhost:8080/MyApplication retry=1 acquire=3000 timeout=600 Keepalive=On
ProxyPassReverse /MyApplication http://localhost:8080/MyApplication

Je suis maintenant confronté au problème que certaines réponses MyApplication dépendent de l'URL de demande d'origine. Concret: un document WSDL sera fourni avec un élément qui a un schemaLocation="<RequestUrl>?xsd=MyApplication.xsd" élément.

Avec ma configuration actuelle, il ressemble toujours

<xs:import namespace="..." schemaLocation="http://localhost:8080/MyApplication?xsd=MyApplication.xsd"/>

mais ça devrait être

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"/>

Je suppose que c'est une exigence courante. Mais comme je ne suis pas un expert en configuration du serveur Apache http et de ses modules, je serais heureux si quelqu'un pouvait apporter une aide (détaillée).

Merci d'avance!

22
FrVaBe

Si vous exécutez Apache> = 2.0.31, vous pouvez essayer de définir la directive ProxyPreserveHost comme décrit ici .

Cela devrait passer l'en-tête Host d'origine via mod_proxy dans votre application, et normalement l'URL de demande y sera reconstruite (dans votre conteneur Servlet) en utilisant l'en-tête Host, donc l'emplacement du schéma doit être construit en utilisant les informations Host et path de "avant" le proxy.

(Publié ici aussi par souci d'exhaustivité)

27
jCoder

Voici une autre alternative si vous souhaitez conserver à la fois le nom d'hôte d'origine et le nom d'hôte mandaté.

Si vous utilisez mod_proxy, désactivez ProxyPreserveHost dans la configuration Apache. Pour la plupart des serveurs proxy, y compris mod_proxy, lisez le X-Forwarded-Host en-tête dans votre application. Ceci identifie l'en-tête Host d'origine fourni par la demande HTTP.

Vous pouvez lire sur les en-têtes mod_proxy (et éventuellement d'autres serveurs proxy standard) définis ici:

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

6
ricosrealm

Vous devriez pouvoir faire un mod_rewrite dans Apache pour coder l'URL complète en tant que paramètre de requête, ou peut-être une partie du fragment. La facilité avec laquelle cela peut être dépend de si vous pouvez utiliser l'un ou l'autre dans le cadre de vos requêtes entrantes.

Par exemple, http://external.foo.bar/MyApplication pourrait être réécrit en http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication qui est ensuite passé dans le ProxyPass puis retiré.

Un peu de piratage, oui, et peut-être un peu délicat de faire fonctionner la réécriture et le proxy dans le bon ordre et de ne pas interférer les uns avec les autres, mais il semble que cela devrait fonctionner.

1
Seth Robertson