Nginx配置HTTP转HTTPS及HSTS预加载失败求助(AWS ELB场景)
我之前在ELB+Nginx的环境里折腾过HSTS配置,刚好能解决你的问题!你的核心问题是只配置了HTTP到HTTPS的重定向,但没有在HTTPS响应里添加HSTS头——毕竟HSTS规则是要通过HTTPS返回给浏览器的,光有重定向没用。
正确的Nginx配置方案
修改你的/etc/nginx/conf.d/default.conf为以下内容,适配ELB的SSL终止场景:
server { listen 80 default_server; listen [::]:80 default_server; server_name My_domain; # 1. 把ELB转发过来的原HTTP请求重定向到HTTPS if ($http_x_forwarded_proto = "http") { return 301 https://$server_name$request_uri; } # 2. 给ELB转发过来的HTTPS请求添加HSTS头 # always参数确保错误响应(如404/500)也带HSTS头,是测试通过的关键 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # 这里放你的业务配置(比如静态文件路径、反向代理规则等) root /usr/share/nginx/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } }
关键配置解释
- 为什么用
$http_x_forwarded_proto?因为你的SSL证书在ELB上,Nginx收到的所有请求都是HTTP协议,必须通过ELB传递的这个头来判断用户原请求是HTTP还是HTTPS。 - HSTS参数细节:
max-age=63072000:让浏览器缓存HSTS规则1年(预加载测试要求至少180天)includeSubDomains:将HSTS规则应用到所有子域名(如果不需要可以去掉,但预加载建议保留)preload:提交到HSTS预加载列表的必要标记always:确保所有响应(包括错误页)都携带HSTS头,避免测试工具抓不到
后续操作步骤
- 验证配置合法性:
sudo nginx -t - 重启Nginx生效:
sudo systemctl restart nginx - 再次去HSTS预加载站点测试,就能正常检测到HSTS头了
注意:一旦开启preload并提交到预加载列表,后续取消会非常麻烦(浏览器缓存+预加载列表同步延迟),请确认你的域名及所有子域名都能稳定支持HTTPS后再操作。
内容的提问来源于stack exchange,提问作者southouse
相关产品推荐
相关产品推荐

