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!
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é)
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:
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.