Spring 重定向命令重定向到 Load Balancer 下的本地主机
Spring Redirect Command Redirects to Localhost under Load Balancer
我在 Tomcat 上使用 Spring MVC 运行 构建了一个 Java 网络应用程序,在 AWS 的 EC2 实例上使用 Apache Httpd 运行 代理,并且使用 SSL 配置负载平衡器。
要求
首先转到负载均衡器,负载均衡器将连接重定向到 Apache 为(https 到 http,因为为负载均衡器配置了 SSL)
Apache 重定向到本地主机 (Tomcat)。
当“/first_uri”的控制器进行重定向时,如
redirect:https://sub.some_domain/some_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
我在 Tomcat 上使用 Spring MVC 运行 构建了一个 Java 网络应用程序,在 AWS 的 EC2 实例上使用 Apache Httpd 运行 代理,并且使用 SSL 配置负载平衡器。
要求
首先转到负载均衡器,负载均衡器将连接重定向到 Apache 为(https 到 http,因为为负载均衡器配置了 SSL)
Apache 重定向到本地主机 (Tomcat)。
当“/first_uri”的控制器进行重定向时,如
redirect:https://sub.some_domain/some_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