10

我有一个 ELB(Amazon Elastic Load Balancer)配置为对 HTTPS 上的最终用户请求进行负载平衡,在后端我的应用程序在 HTTP 上配置的 Tomcat 服务器上运行。

因此,当我的最终用户向应用程序发出请求时,请求将在 HTTPS 上,因为他们访问 ELB,现在,ELB 在内部通过 HTTP 将其重定向到 tomcat 服务器。在 tomcat 中,我的应用程序通过 Spring Security 受到保护,如果请求是针对受保护资源的并且用户未登录,则用户将被重定向到配置的登录页面。现在,这种对最终用户的重定向将通过 HTTP 进行,因为 tomcat 服务器最初从 ELB 获得的请求是 HTTP。现在这将导致 404,因为我没有为 HTTP 上的传入流量配置。

我们如何解决这个问题?是在最终用户 ELB 和 ELB-tomcat 上都有 HTTPS 的唯一选择,还是我在这里遗漏了一些东西?

4

2 回答 2

10

ELB 设置一个X-Forwarded-Proto标头,允许您告诉客户端用于连接到负载均衡器的协议。请参阅文档

您可以配置 spring security 以查看此标头,例如查看此答案

于 2012-03-29T12:59:51.177 回答
0

我很难在网上找到这个,最后我找到了一种方法。

问题是,一旦 http 在内部重定向到 ELB 上的 https 端口,它就会被重定向回端口 80,从而创建一个循环。发生这种情况是因为 ELB 卸载了 SSL,然后再次连接到端口 80。

最后经过一些研究,我得到了正确的重写规则来管理 X-Forwarded-Proto,即使 ELB 卸载 SSL tomcat 也可以到达现在原始请求使用 SSL。

这是使用 Tomcat 8 上的 Tomcat Valves 完成的。我相信它也可以在早期版本上完成。我已经使用阀门在 Tomcat 上启用了重写规则。之后就像在 Apache 上编写重定向规则一样简单。

以下是步骤:

第1步:

一种。打开tomcat conf文件夹下的context.xml b. 在下面粘贴以下行

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

注意:这将全局启用阀门。如果需要为特定主机启用此功能,则应将其粘贴到该特定域的 server.xml 中

第2步:

一种。打开 conf/server.xml b. 在上面粘贴以下行 </Host>

<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />

第 3 步:

一种。打开 web.xml 所在的文件夹。例如,如果应用程序托管在 ROOT 下,则 web.xml 将位于 webapps/ROOT/WEB-INF

湾。同样,如果应用程序托管在 webapps/myappfolder 下,那么 web.xml 将位于 webapps/myappfolder/WEB-INF

C。在 WEB-INF 文件夹中创建一个新文件 rewrite.config。并粘贴以下重写规则:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
于 2016-10-02T11:44:57.850 回答