Nginx:使用头检测HTTPS连接

在我的负载均衡器上,我终止与Nginx的HTTPS连接,然后将请求代理到一个也由Nginx支持的Web服务器。

在fastcgi_params的负载均衡器中,我有:

fastcgi_param HTTPS $https; 

在Web服务器上有一个只能通过HTTPS访问的站点。 如何检测HTTPS参数是否设置,如果不redirect到网站的安全版本?

如果我正确理解你,你的设置是这样的:

客户端 – (http / https) – > nginx(前) – (http) – > nginx(后退) – (fastcgi) – >应用程序

实际上有3个不同的地方可以进行redirect:

在你的前端Nginx服务器上,你可以在需要的时候redirect:

 if ( $https != 'on' ) { return 301 https://$host$request_uri; } 

如果你不能在前面的Nginx服务器上这样做,你必须携带使用的协议的信息来支持Nginx的实例。 通常的方法是使用X-Forwarded-Proto头。 您应该在您的前端Nginx服务器的适当位置添加:

 proxy_set_header X-Forwarded-Proto $scheme; 

然后,你可以在后面的Nginx服务器中redirect:

 if ( $http_x_forwarded_proto != 'https' ) { return 301 https://$host$request_uri; } 

显然,你也可以在应用程序中处理redirect。 您应该在应用程序中提供X-Forwarded-Proto标头,或者您可以将其设置为fastcgi param:

http {}中的某处

 map $http_x_forwarded_proto $fe_https { default off; https on; } 

和额外的映射:

 fastcgi_param HTTPS $fe_https; 

就我个人而言,我认为redirect应该尽早在一个链条中进行。