在我的负载均衡器上,我终止与 Nginx 的 HTTPS 连接,然后将请求代理到同样由 Nginx 支持的 Web 服务器之一。
在 fastcgi_params 中的负载均衡器上我有:
fastcgi_param HTTPS $https;
在 Web 服务器上,有一个站点只能通过 HTTPS 访问。如何检测是否设置了 HTTPS 参数,如果没有,如何重定向到该站点的安全版本?
答案1
如果我理解正确的话,你的设置如下:
客户端 -(http/https)-> nginx(前端) -(http)-> nginx(后端) -(fastcgi)-> 应用程序
实际上有 3 个不同的地方可以进行重定向:
在你的前端 Nginx 服务器上,你可以在需要时执行重定向:
if ( $https != 'on' ) {
return 301 https://$host$request_uri;
}
如果你无法在前端 Nginx 服务器上执行此操作,则必须将所用协议的信息传送到后端 Nginx 实例。通常的方法是使用 X-Forwarded-Proto 标头。你应该在前端 Nginx 服务器上的适当位置添加:
proxy_set_header X-Forwarded-Proto $scheme;
然后,您可以在后端 Nginx 服务器中进行重定向:
if ( $http_x_forwarded_proto != 'https' ) {
return 301 https://$host$request_uri;
}
显然,你也可以在应用程序内部处理重定向。你应该在应用程序中提供 X-Forwarded-Proto 标头,或者你可以将其设置为 fastcgi 参数:
http {} 中的某处
map $http_x_forwarded_proto $fe_https {
default off;
https on;
}
以及额外的映射:
fastcgi_param HTTPS $fe_https;
就我个人而言,我认为重定向应该在链中尽可能早地完成。