我有一个网站,我希望始终在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式内容)。
因此,你所提出的愿望虽然有用,但必须被视为一种优化。
在应用程序结束时也可能存在敏感性。 不知道你的应用程序什么,这里有一些潜在的事情要考虑:
你也许可以用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文件 ,这解决了这个问题!