Nginx:使用标头检测 HTTPS 连接

Nginx:使用标头检测 HTTPS 连接

在我的负载均衡器上,我终止与 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;

就我个人而言,我认为重定向应该在链中尽可能早地完成。

相关内容