最直接有效的方式是配置独立的80端口server块,用return 301 https://$host$request_uri;跳转至https,不经过rewrite引擎、性能高、保留路径参数;同时必须确保443端口https server块已独立启用ssl证书并正常响应。

最直接有效的方式,是在 Nginx 中为 HTTP 请求单独配置一个监听 80 端口的 server 块,用 return 301 指令跳转到对应 HTTPS 地址。它不经过 rewrite 引擎,性能高、语义清晰、搜索引擎友好,且天然保留路径和查询参数。
必须独立配置 listen 80 的 server 块
不能把跳转逻辑塞进 HTTPS 的 server 块里,Nginx 不允许同一个块同时监听 80 和 443 ssl。否则会报错或静默失效。正确做法是另起一个纯 HTTP 的 server:
- 明确写
listen 80; -
server_name列出所有合法域名,如example.com www.example.com - 只放一条
return 301 https://$host$request_uri;,末尾加分号
目标地址推荐用 $host 而非 $server_name
$host 来自请求头中的 Host 字段,能准确反映用户访问的实际域名;$server_name 只取配置中第一个匹配项,在多域名场景下容易失准。
- 若站点支持泛域名或经 CDN 访问,
$host更实用 - 若对安全性要求极高(如禁止客户端伪造 Host),可改用硬编码域名,例如
https://www.example.com$request_uri - 避免写
$scheme://——HTTP 请求的$scheme是http,会导致跳回明文地址
HTTPS server 必须已就绪且独立
return 301 只负责跳转,不提供加密。跳过去如果打不开,整个流程就失败了。确保另一个 server 块已正确启用 HTTPS:
listen 443 ssl http2;-
ssl_certificate和ssl_certificate_key指向有效的证书文件路径 - 建议加上安全头,例如:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
验证与生效关键步骤
改完配置不能直接 reload,必须先验证再上线:
- 运行
nginx -t检查语法是否合法,避免因漏分号等低级错误导致服务中断 - 确认返回状态码是
301 Moved Permanently,不是 302(可用curl -I http://example.com查看响应头) - 检查
Location响应头是否完整准确,路径和查询参数(如?id=123&ref=test)不能丢失 - 执行
nginx -s reload或systemctl reload nginx生效











