Spring 重定向命令重定向到 Load Balancer 下的本地主机

Spring Redirect Command Redirects to Localhost under Load Balancer

我在 Tomcat 上使用 Spring MVC 运行 构建了一个 Java 网络应用程序,在 AWS 的 EC2 实例上使用 Apache Httpd 运行 代理,并且使用 SSL 配置负载平衡器。

要求

https://some_domain/first_uri

首先转到负载均衡器,负载均衡器将连接重定向到 Apache 为(https 到 http,因为为负载均衡器配置了 SSL)

http://some_domain/first_uri

Apache 重定向到本地主机 (Tomcat)。

当“/first_uri”的控制器进行重定向时,如

redirect:https://sub.some_domain/some_uri

我在浏览器中看到的结果是

https://localhost/first_uri

我只是不知道我必须在这里配置什么,配置Spring?配置 Apache HTTPD 或负载平衡器?

如果有人遇到同样的问题,请帮忙。

不:还使用 Spring 安全性。

Not2:我只是在没有 SSL 的情况下尝试(使用 http),同样的事情发生了,我认为这与 https 的使用无关。

更新:只有在我尝试重定向到子域时才会出现此问题

解决:必须关闭ProxyPreserveHost!

原因:如果开启,代理后端返回的响应头将包含“localhost”或没有端口号(或80)的真实域名。所以ProxyPassReverse pattern不匹配(因为不同的端口,如果使用其他域名,域名也不会匹配)。

配置:

<VirtualHost localhost:80>

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

</VirtualHost>

但这只能通过 http 进行,不能通过 ajp 进行(我不知道为什么)。 如果您仍然想使用 ajp,您可以使用以下解决方法 - 让 Apache 在错误的重定向之后再做一次重定向:

<VirtualHost localhost:80>

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

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

</VirtualHost>

需要 ProxyPass /WebApp ! 指令将路径从 mod_proxy 中的进一步处理中排除(因为代理指令在重定向指令之前被评估)

然后 RedirectMatch 指令将所有以 /WebApp/... 表示的内容分别重定向到 /WebApp 到 URL 而没有 /WebApp 开头。

唯一的缺点是您的 Web 应用程序中不能有任何名为 WebApp 的子文件夹

查看此 answer 后,我在 httpd.conf 上进行了以下设置(在文档末尾):

ProxyRequests Off
ProxyPreserveHost On

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

在该配置之后,spring 再次开始重定向到正确的域 :) 我希望这对像我这样的人有所帮助,谢谢大家!

以下对我有用:

在tomcatserver.xml中: (主要在 /opt/tomcat/conf/server.xml)

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

这里的 proxyName 是 "localhost"。 将 proxyName 更改为您所需的域。

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

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