如何在AWS Lightsail中强制仅用HTTPS?解决重定向循环问题
解决AWS Lightsail负载均衡下Nginx的HTTPS重定向循环问题
好问题!你碰到的ERR_TOO_MANY_REDIRECTS确实是Lightsail负载均衡的典型场景——因为负载均衡已经帮你完成了HTTPS终止(在负载均衡层面处理SSL证书),然后所有流量都会以HTTP协议(80端口)转发到你的EC2实例。这就导致Nginx里的$scheme变量永远是http,你的重定向规则会一直把请求往HTTPS推,自然就陷入循环了。
怎么获取原始请求的协议?
Lightsail负载均衡会自动把用户实际发起请求的协议(http或https)放在X-Forwarded-Proto请求头里,传给后端的Nginx。你只需要基于这个头来判断是否需要重定向,而不是用$scheme。
修改后的Nginx配置
把你原来的重定向规则替换成基于X-Forwarded-Proto的判断,同时调整proxy_set_header里的X-Forwarded-Proto值,确保后端服务也能拿到原始协议:
server { listen 80; server_name mountainviewwebtech.ca www.mountainviewwebtech.ca; # 基于负载均衡传来的原始协议做重定向 if ($http_x_forwarded_proto != 'https') { return 301 https://$host$request_uri; } location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 把负载均衡传来的原始协议传给后端服务 proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; } }
为什么这样能解决问题?
- 当用户用HTTPS访问时,负载均衡会在请求头里带上
X-Forwarded-Proto: https,Nginx判断后不会触发重定向; - 当用户用HTTP访问时,负载均衡会带上
X-Forwarded-Proto: http,Nginx就会把请求重定向到HTTPS版本,不会出现循环; - 调整后的
proxy_set_header X-Forwarded-Proto能让你后端的3000端口服务也知道用户实际用的是哪种协议,避免后续逻辑出错。
另外,确认一下你的Lightsail负载均衡已经正确配置了443端口的HTTPS监听器并关联了证书,这部分你已经完成了,所以不需要额外调整。
内容的提问来源于stack exchange,提问作者SuperVeetz
相关产品推荐
相关产品推荐

