你如何强制Apache负载平衡器重写http 302redirect到https?

我有一个网站,我希望始终在https中提供服务。 该网站使用Apache进行负载平衡。

Apache负载平衡器的configuration基本如此:

<Proxy balancer://mycluster> BalancerMember http://server1 route=server1 BalancerMember http://server2 route=server2 </Proxy> 

请注意,所有的http 请求都被改写为https请求,并使用mod重写。

我想要做的是确保从服务器1或服务器2的任何http 302位置标题被重写并发送为https 302redirect标头。

例如

如果来自服务器1的响应具有以下内容作为标题:

 Location: http://server1/test 

我希望它被安全地重写为

 Location: https://server1/test 

这将避免请求被发送到客户端,然后客户端发送http请求,将其重写为https,并且还将避免任何通过http发送的响应的安全问题。

我怎样才能做到这一点?

你不能这样做mod_rewrite,因为这只是请求。

此外,在Location上运行并不是100%的解决scheme(它会很高),因为它不会捕获像HTTP元刷新(现在不是很常见)或者生成URL的实例使用客户端解决scheme(如Javascript,embedded式内容)。

因此,你所提出的愿望虽然有用,但必须被视为一种优化。

在应用程序结束时也可能存在敏感性。 不知道你的应用程序什么,这里有一些潜在的事情要考虑:

  • cookie生成以及诸如“安全”属性的使用
  • 应用程序可能已经生成了URL并完成了一些encryption签名(可能是为了SSO或authentication目的,并且将其改写为https可能会使URL失效)….实际上不太可能,但是当然可能。

你也许可以用mod_header来做到这一点,它可以操纵响应头。 请参阅http://httpd.apache.org/docs/2.2/mod/mod_headers.html

 Header edit Location ^http: https: 

我还没有testing过,请注意,可以在edit关键字之前指定一个条件。

希望它有助于卡梅隆

虽然不是直接回答这个问题,但下面的Apacheconfiguration更改是我用来解决问题的:

 RequestHeader set X-Forwarded-Proto "https" env=HTTPS 

这样做使得负载平衡器中的节点理解为在传入上述头部时将其绝对http url重写为https url。

这是由这个ServerFault后 ,这最终导致这在docker文件 ,这解决了这个问题!