Nginx 中应配置独立的 HTTP server 块监听 80 端口,用 return 301 https://$host$request_uri 实现全路径 HTTPS 重定向;HTTPS server 需正确配置 listen 443 ssl、证书及匹配的 server_name。

在 Nginx 中实现将所有 HTTP 请求永久重定向到 HTTPS,核心是配置一个只监听 80 端口的 server 块,并使用 return 301 指令跳转到对应的 HTTPS 地址。
配置单独的 HTTP server 块用于重定向
这是最清晰、推荐的做法。你需要确保有一个专门处理 HTTP(端口 80)的 server 块,它不提供实际服务,只做 301 跳转:
- 监听
80端口,且通常绑定到所有 IPv4 和 IPv6 地址(listen 80;或listen *:80;) - 使用
return 301 https://$host$request_uri;实现完整 URL 重定向(保留路径和查询参数) - 避免在 HTTPS server 块里用 if 判断做重定向(效率低、易出错)
确保 HTTPS server 正常工作
重定向只是“指路”,真正承载业务的是 HTTPS server。需确认:
- 已正确配置
listen 443 ssl,并指定ssl_certificate和ssl_certificate_key - 域名匹配:HTTPS server 的
server_name应与 HTTP server 一致,否则 $host 可能不准确 - 若使用通配符证书或多个域名,建议统一用
$host而非硬编码域名,提升可维护性
注意 Host 头和代理场景
如果 Nginx 前面还有负载均衡器或 CDN(如 Cloudflare),HTTP 请求可能实际来自它们的 IP,且 X-Forwarded-Proto 头会标识原始协议:
- 此时仅靠监听 80 端口的重定向仍有效,因为那是最外层入口
- 但若你把 Nginx 放在反向代理后且只暴露 HTTPS 端口,则无需监听 80 —— 重定向应由前置组件完成
- 不建议在 Nginx 内通过
if ($scheme = http)做判断重定向,属于不良实践
完整最小配置示例
以下是一个干净、可直接使用的配置片段:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
<p>server {
listen 443 ssl http2;
server_name example.com www.example.com;</p><pre class="brush:php;toolbar:false;">ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 其他 location、root 等配置...
location / {
# ...
}
}











