CatCoding

Nginx https too many redirect

2018-02-23

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 这样的跳转逻辑尽量放在请求链路的最外层,这样问题会少一些。

公号同步更新,欢迎关注👻
Tags: Nginx