fragen stichworte

Behalten Sie die ursprüngliche Anforderungs-URL in der mod_proxy-Weiterleitung bei

Ich führe eine Webanwendung auf einem Servlet-Container (Port 8080) in einer Umgebung aus, auf die über das Internet (extern) und das interne Unternehmen (intern) zugegriffen werden kann, z.

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

Die eingehenden (externen/internen) Anforderungen werden mithilfe eines Apache-HTTP-Servers mit mod_proxy an den Servlet-Container umgeleitet. Die Konfiguration sieht folgendermaßen aus:

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

Ich habe jetzt das Problem, dass einige Antworten von MyApplication von der ursprünglichen Anforderungs-URL abhängen. Konkret: Ein WSDL-Dokument wird mit einem Element versehen, das ein schemaLocation="<RequestUrl>?xsd=MyApplication.xsd" -Element enthält.

Bei meiner aktuellen Konfiguration sieht es immer aus wie

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

aber es sollte

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

Ich nehme an, dass dies eine häufige Anforderung ist. Da ich aber kein Experte für die Konfiguration des Apache-HTTP-Servers und seiner Module bin, würde ich mich freuen, wenn mir jemand (detaillierte) Hilfe geben könnte.

Vielen Dank im Voraus!

PS: Ich habe dies auch auf stackoverflow gepostet, dachte aber, dass dies der bessere Ort ist.

antworten

Wenn Sie Apache> = 2.0.31 ausführen, können Sie versuchen, die ProxyPreserveHost -Direktive wie hier beschrieben festzulegen.

Dies sollte den ursprünglichen Hostheader über mod_proxy in Ihre Anwendung übergeben. Normalerweise wird die Anforderungs-URL dort (in Ihrem Servlet-Container) mithilfe des Hostheader neu erstellt, sodass der Schemaspeicherort mithilfe der Host- und Pfadinformationen erstellt wird "vor" dem Proxy.

Sie sollten in apache einen mod_rewrite ausführen können, um die vollständige URL als Abfrageparameter oder möglicherweise als Teil des Fragments zu kodieren. Wie einfach dies ist, hängt davon ab, ob Sie die eine oder andere als Teil Ihrer eingehenden Abfragen verwenden.

Beispielsweise könnte http://external.foo.bar/MyApplication in http://external.foo.bar/MyApplication#rewritemagic=http://external.foo.bar/MyApplication überschrieben werden, das dann an den ProxyPass übergeben und dann entfernt wird.

Ein bisschen hack, ja, und vielleicht ein bisschen knifflig, um das Umschreiben und das Proxy in der richtigen Reihenfolge arbeiten zu lassen und sich nicht gegenseitig zu stören, aber es scheint, als müsste es funktionieren.