Http 请求在经过多层 Nginx 的时候,通常强制 http 跳转到 https 的时候会这样配置:
return 302 https://$host$request_uri;
## 需要注意这里是 request_uri 而不是 uri,否则会引起安全问题
但是如果是多层 Nginx,前面的 Nginx 需要把用户原始请求的 scheme 传递到后端,可以加上头部设置:
proxy_set_header X-Forwarded-Proto $scheme;
后面的 Nginx 再判断一次:
if ( $http_x_forwarded_proto != 'https' ) {
return 301 https://$host$request_uri;
}
否则强制 https 经常会出现类似ERR_TOO_MANY_REDIRECTS 将您重定向的次数过多
这样的问题。
可是在实践过程中偶尔也碰到过一些 ELB 会丢掉 scheme 的问题,比如在这样的请求链路情况下elb => nginx => nginx => application
第二层 Nginx 获取的 scheme 就有问题了,这也可能会导致too many redirects
问题。
可以尝试在第二层 Nginx 上这样解决:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
当然强制 https 这样的跳转逻辑尽量放在请求链路的最外层,这样问题会少一些。