2016-07-21 22 views
0

Ich habe eine Java-Webanwendung mit Spring MVC auf Tomcat Proxied mit Apache Httpd läuft auf einer EC2-Instanz bei AWS und konfiguriert einen Load Balancer mit SSL.Spring Redirect-Befehl lenkt auf Localhost unter Load Balancer

Die Anfrage

https://some_domain/first_uri

erste geht zum Lastenausgleich, umleitet Lastausgleicher die Verbindung zu Apache als (https zu http da SSL für den Lastausgleicher konfiguriert ist)

http://some_domain/first_uri

Apache leitet zum localhost (Tomcat) um.

Wenn der Regler für "/first_uri" wie eine Umleitung macht

Umleitung: https://sub.some_domain/some_uri

ich das Ergebnis bei Browser wie

https://localhost/first_uri

Ich konnte einfach nicht herausfinden, was ich hier konfigurieren muss, konfigurieren Sie die Feder? Konfigurieren Sie den Apache HTTPD oder den Load Balancer?

Wenn jemand mit dem gleichen Problem konfrontiert wurde, bitte helfen.

Nicht: Auch Spring Security.

Not2: Ich habe gerade versucht ohne SSL (mit http) und das gleiche passiert, ich denke, das ist nicht mit der Verwendung von https verbunden.

Update: Dieses Problem kann nur dann auftreten, wo ich

+0

Also einfach klar sein, Sie dies in den Browser https: // some_domain/first_uri und es wird auf https umgeleitet: // localhost/first_uri? – error2007s

+0

Ja, Sie haben Recht. Insbesondere wende ich mich an eine andere URL an, die intern an some_domain/first_uri umgeleitet wird (von Spring security an loginFormUrl set von security.xml) und die Anfrage bleibt dort stehen, weil dieser Controller ("/ first_uri") eine Weiterleitung als "redirect" sendet : https: //sub.some_domain/some_uri ". – webmaster

+0

und Ergebnisse ist "localhost/first_uri" – webmaster

Antwort

0

Nach der Besichtigung dieses answer benannt haben muss, habe ich die folgenden (am Ende des Dokuments) auf meinem httpd.conf Einstellung:

ProxyRequests Off 
ProxyPreserveHost On 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

Und nach dieser Konfiguration Frühjahr begann wieder auf die richtige Domain zu umleiten :) ich hoffe, dass dies für viele wie mir helfen, danke an alle!

0

Lösung für eine Sub-Domain zu umleiten versuchen: ProxyPreserveHost ausgeschaltet sein muss!

Grund: Wenn es eingeschaltet ist, enthalten die Antwortkopfzeilen, die vom Proxy-Backend zurückgegeben werden, "localhost" oder die echte Domäne ohne die Portnummer (oder 80). Daher stimmt das ProxyPassReverse-Muster nicht überein (wegen des unterschiedlichen Ports und wenn ein anderer Domänenname verwendet wird, wird auch der Domänenname nicht übereinstimmen).

Config:

<VirtualHost localhost:80> 

    ProxyPreserveHost Off 
    ProxyPass/http://localhost:8080/WebApp/ 
    ProxyPassReverse/http://localhost:8080/WebApp/ 

</VirtualHost> 

Aber dies nur über http funktioniert, nicht über AJP (ich weiß nicht, warum). Wenn Sie noch verwenden möchten AJP Sie die folgende Abhilfe verwenden könnte - Lassen Sie Apache ein anderer nach der falschen Umleitung umleiten tun:

<VirtualHost localhost:80> 

    ProxyPass /WebApp ! 
    ProxyPass/ajp://localhost:8009/WebApp/ 
    ProxyPassReverse/ajp://localhost:8009/WebApp/ 

    RedirectMatch 301 ^/WebApp/(.*)$ /$1 
    RedirectMatch 301 ^/WebApp$/

</VirtualHost> 

Die ProxyPass /WebApp ! Richtlinie benötigt wird, um den Weg von der weiteren Verarbeitung in Mod_proxy die auszuschließen sind (weil Proxy-Richtlinien wird vor der Weiterleitung Richtlinien ausgewertet)

Dann wird die RedirectMatch Richtlinien alles umleiten mit /WebApp/... jeweils /WebApp an die URL ohne /WebApp am Anfang erklärt.

Der einzige Nachteil ist, dass Sie keine Unterordner WebApp in Ihrer Web-Anwendung

+0

Dies hat nicht gelöst. Ich denke, mein Problem ist anders, weil ich eine andere Umleitungen innerhalb Code und sie funktionieren gut, aber vielleicht nur Umleitung auf Subdomains wie "redirect: sub.some_domain" verursacht einen "localhost" in der URL? – webmaster

0

Das funktioniert für mich folgende:

In tomcat server.xml: (meist bei /opt/tomcat/conf/server.xml)

<Connector port="8080" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="8443" 
      proxyName="localhost" 
      proxyPort="443" 
      scheme="https"/> 

Hier proxyname ist "localhost". Ändern Sie den Proxy-Namen in die erforderliche Domäne.

<Connector port="8080" protocol="HTTP/1.1" 
      connectionTimeout="20000" 
      redirectPort="8443" 
      proxyName="mydomain.com" 
      proxyPort="443" 
      scheme="https"/> 

Siehe: http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#Proxy_Support