最直接有效的方式是在 Nginx 的 80 端口 server 块中用 return 301 https://$host$request_uri; 实现 HTTP 到 HTTPS 自动跳转,同时需配置独立的 443 SSL server 块并正确加载证书、启用 TLS 协议及加密套件。

配置监听 80 端口的重定向 server 块
在 Nginx 配置文件(如 /etc/nginx/sites-available/default 或自定义 conf 文件)中添加以下内容:
-
监听所有 HTTP 请求:使用
listen 80 default_server;或明确指定域名 -
设置域名匹配:用
server_name example.com www.example.com;,避免泛匹配引发风险 -
执行永久跳转:写入
return 301 https://$host$request_uri; -
注意变量安全:若担心 Host 头被篡改(如 IP 直连),可改用固定域名,例如
return 301 https://www.example.com$request_uri;
必须同时配置独立的 HTTPS server 块
仅做跳转不够,后端 HTTPS 服务必须能正常响应,否则用户会看到连接失败或证书错误。
-
监听 443 端口:写
listen 443 ssl http2;(http2 可选但推荐) -
加载证书与密钥:确认路径正确,权限为
600,例如:ssl_certificate /etc/nginx/ssl/fullchain.pem;ssl_certificate_key /etc/nginx/ssl/privkey.pem; -
启用现代 TLS 协议:添加
ssl_protocols TLSv1.2 TLSv1.3; -
配置加密套件:推荐使用安全且兼容性好的组合,例如:
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256';
代理环境下的补充处理(如 CDN、ALB、Traefik)
当 Nginx 前面有 HTTPS 终结代理时,用户实际发的是 HTTPS,但代理以 HTTP 转发给 Nginx,此时 `$scheme` 是 `http`,80 端口跳转失效。
-
启用 497 错误捕获:在 443 server 块内添加:
error_page 497 =301 https://$host$request_uri; -
确保代理透传协议头:代理需发送
X-Forwarded-Proto: https -
允许下划线 Header(如需):在 http 块开头加
underscores_in_headers on;
验证与生效步骤
修改配置后务必逐项检查,避免服务中断或跳转异常。
-
备份原配置:运行
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak -
语法检测:执行
nginx -t,确认输出 “syntax is ok” 和 “test is successful” -
重载服务:用
systemctl reload nginx(不中断已有连接) -
手动测试跳转:运行
curl -I http://example.com/test?x=1,观察是否返回301且Location头含完整 HTTPS 地址


















