Nginx实现HTTP强制跳转HTTPS的核心是配置独立的80端口server块,使用return 301 https://$server_name$request_uri指令完成永久重定向,同时确保443端口server块已正确启用SSL证书并监听,避免循环跳转。

在 Nginx 中实现 HTTP 强制跳转 HTTPS,核心是通过 return 301 或 rewrite 指令,在处理 HTTP 请求(80 端口)的 server 块中,把所有请求重定向到对应的 HTTPS 地址。
配置监听 80 端口并返回 301 重定向
这是最常用、最推荐的方式。单独定义一个只监听 80 端口的 server 块,对所有请求统一跳转:
server {
listen 80;
server_name example.com www.example.com;
<pre class="brush:php;toolbar:false;"># 强制跳转到 HTTPS,保持原始请求路径和参数
return 301 https://$server_name$request_uri;}
-
$server_name 会使用当前匹配的域名,适合多域名场景;也可写死为
https://example.com -
$request_uri 保留完整路径和查询参数(如
/path?x=1),确保跳转不丢参数 - 务必用 301(永久重定向),利于 SEO 和浏览器缓存;调试阶段可用 302 临时跳转
确保 HTTPS server 正常工作
跳转只是前端动作,后端 HTTPS 服务必须已正确配置,否则用户会看到连接失败:
server {
listen 443 ssl http2;
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;
# 其他配置(root、location 等)
root /var/www/html;
index index.html;}
- 确认 SSL 证书路径正确,且 Nginx 有读取权限
- 建议启用
http2提升性能(需 OpenSSL 1.0.2+ 和 Nginx 1.9.5+) - 避免在 HTTPS 的 server 块里再写跳转逻辑,防止循环重定向
常见问题与注意事项
实际部署中容易踩坑,注意以下几点:
- 如果用了 CDN(如 Cloudflare),源站 Nginx 可能收不到真实
https协议头,此时需检查$scheme是否仍为http;可配合proxy_set_header X-Forwarded-Proto $scheme;和应用层判断 - 不要在同一个 server 块里同时监听 80 和 443 并用 if 判断跳转(如
if ($scheme = http) { return 301 ... }),Nginx 官方明确不推荐在 server 级别用 if - 若启用了 HSTS(
add_header Strict-Transport-Security ...),首次访问仍需走一次 HTTP 跳转;开启后浏览器会自动将后续 HTTP 请求升级为 HTTPS











