Nginx强制HTTP跳转HTTPS需两步:80端口用return 301重定向至https://$host$request_uri;443端口server块配置有效SSL证书并启用HSTS头增强安全。

在 Nginx 中实现 HTTP 强制跳转 HTTPS,核心是通过 return 301 指令将所有 HTTP 请求重定向到对应的 HTTPS 地址。关键在于配置监听 80 端口的 server 块,并确保 HTTPS 的 server 已正确配置 SSL 证书。
配置独立的 HTTP server 块进行 301 跳转
这是最推荐、最清晰的做法:为 HTTP(端口 80)单独定义一个 server 块,只做重定向,不处理业务逻辑。
- 在 Nginx 配置文件(如 /etc/nginx/conf.d/example.com.conf)中添加或确认存在如下 server 块:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
说明:
– $server_name 保证跳转到当前访问的域名(支持多域名);
– $request_uri 保留原始路径和查询参数,避免丢失 URL 上下文;
– 使用 301(永久重定向)有利于 SEO 和浏览器缓存;
– 不要在此块中启用 SSL 或写 location,它只负责跳转。
确保 HTTPS server 正常工作
跳转的前提是 HTTPS 服务本身可用。需确认另一个 server 块监听 443 端口并已配置有效证书:
- 检查是否包含
listen 443 ssl;和正确的证书路径:
server {
listen 443 ssl;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 其他 location、root 等配置...}
注意:
– 证书路径必须准确,且 Nginx 有读取权限;
– 推荐使用 Let’s Encrypt 的 fullchain.pem + privkey.pem 组合;
– 可用 nginx -t 测试语法,systemctl reload nginx 重载配置。
避免常见错误
以下做法容易导致跳转失败或循环重定向:
- 在同一个 server 块里混用
listen 80和ssl on(Nginx 1.15+ 已废弃 ssl on,且不可共存); - 使用
rewrite替代return 301—— 性能更低,且易出错(如未加 break 或 flag); - HTTPS server 中遗漏
server_name,导致$server_name为空,跳转成https:///...; - 防火墙或云服务商(如阿里云、Cloudflare)未放行 443 端口,或 HTTPS 请求被中间层拦截。
可选:兼容 HTTP/2 和 HSTS 增强安全
在 HTTPS server 块中加入以下头,进一步提升安全性与性能:
- 启用 HTTP/2(需 OpenSSL 1.0.2+ 和 Nginx 1.9.5+):
listen 443 ssl http2;
- 添加 HSTS 响应头,强制浏览器后续只走 HTTPS(谨慎启用,初始 max-age 可设小值测试):
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
注意:HSTS 一旦生效,浏览器会自动将 HTTP 请求转为 HTTPS(不经过服务器),因此务必先确保全站 HTTPS 稳定可用。











