Umschreiben von 302 App Server ReDirect-URLs mit Apache Proxy in der Mitte

8

Ich habe ein seltsames Setup. Es sieht aus wie das:

Browser ----------> HTTPs Proxy ------> Apache HTTP -----> Tomcat AJP
           HTTPS                 HTTP                AJP

Auf dem HTTPS-Proxy (einem sehr dummen Proxy) wird eine URL angezeigt, die wie folgt aussieht: https: //proxy.domain.com/app. Es wird dann über HTTP wie http: //apache.domain.com/app (Übergabe des Hosts proxy.domain.com) an Apache getunnelt. Apache tunnelt die Anforderung dann lokal mithilfe des AJP-Protokolls an ajp: // localhost: 8009 / app /.

Manchmal möchte der App-Server den angeforderten Pfad umleiten. Leiten Sie beispielsweise / app / to / app / webapp um. Es sendet also einen 302 zurück an den Apache, der den Pfad umleitet - wahrscheinlich so etwas wie ajp: // localhost: 8009 / app / webapp. Apache schreibt dann die Weiterleitungs-URL zu http: //proxy.domain.com/app/webapp neu. Der HTTPS-Proxy ist dumm, analysiert also nicht die Umleitung und ändert das http in https.

Daher möchte ich herausfinden, ob ich Apache so konfigurieren kann, dass die 302-Umleitungs-URL neu geschrieben wird, um den Benutzer an https zu senden.

Hier ist die Konfiguration, die ich bisher in Apaches https.conf habe:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app

Ich habe versucht, ProxyPassReverse zu verwenden , konnte jedoch nicht herausfinden, wie erzwungen werden kann , die 302-Umleitungs-URL mit https anstelle von http neu zu schreiben.

Irgendwelche Gedanken?

George
quelle

Antworten:

9

Ich ringe immer stundenlang mit einem Problem, bevor ich aufgebe und eine Frage stelle - nur um mein eigenes Problem Minuten nach dem Posten zu lösen ...

Für Interessenten besteht die Lösung nicht darin, ProxyPassReverse zu verwenden , sondern die Header- Direktive zu verwenden - damit können Sie sich mit ausgehenden Headern herumschlagen. In diesem Fall kann ich den Location-Antwortheader erfassen und einen regulären Ausdruck darauf ausführen, um das Protokoll der URL zu korrigieren:

ProxyPreserveHost       on
RewriteEngine           on
RewriteRule ^/app$ /app/ [PT]
ProxyPass /app ajp://localhost:8009/app
Header edit Location ^http(\:\/\/proxy.*)$ https$1

Voila!

Wenn sich Apache beschwert, ist möglicherweise mod_headers noch nicht aktiviert: a2enmod headers

George
quelle
Sie müssen die Header nicht bearbeiten. Suchen Sie nach der @ wondy-Lösung, um Tomcat über RempteIpValve
Muhammad Hewedy
Ich habe diese Lösung verwendet. Ich mache lieber eine Apache-Konfiguration als Tomcat dazu zu bringen, das zu tun, was ich will!
Froderik
3

Ich habe eine andere Option gefunden.

Basierend auf /programming/5741210/handling-x-forwarded-proto-in-java-apache-tomcat und Apache ReverseProxyPass wird auf http anstatt auf https umgeleitet. Einige Server erkennen anscheinend den X-Forwarded-Protocol-Header . Man kann Tomcat erkennen lassen, indem man Folgendes hinzufügt:

<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeader="x-forwarded-protocol" />

zu server.xml.

Wodny
quelle
1
Dies ist die beste Lösung, daher ist Tomcat so konzipiert, dass es so funktioniert
Muhammad Hewedy,
Ich denke du meinst X-Forwarded-Proto.
Michael Hampton
Ich bin mir ziemlich sicher, dass ich "Protokoll" verwendet habe und es funktioniert hat. Aber es war März 2013. Ich kann sehen, dass beide Versionen seit einiger Zeit verwendet werden. Wie ich inzwischen sehen kann, wurde ein neuer RFC 7239 geschrieben (Juni 2014). Wahrscheinlich hat die "Proto" -Version gewonnen und ist jetzt der Standard.
Wodny