最简单高效的方式是用 Nginx 的 return 301 指令监听 80 端口并跳转至 HTTPS,配合 https://$host$request_uri 保留路径与域名,同时确保 443 端口的 HTTPS server 已正确配置 SSL 证书与安全策略。

要让网站所有 HTTP 请求都自动跳转到 HTTPS,最简单高效的方式就是用 return 301 指令。它不经过任何代理或重写逻辑,直接返回状态码和新地址,性能高、配置清晰、兼容性好。
监听 80 端口并强制跳转
Nginx 默认不处理 HTTP(80 端口)的 HTTPS 跳转,需单独定义一个 server 块专门响应 HTTP 请求,并用 return 301 把整个站点重定向到 HTTPS 版本。
在配置文件中添加如下内容:
- 使用
listen 80明确监听 HTTP 流量 -
server_name应与主 HTTPS 站点保持一致(支持多个域名时可用空格分隔) -
return 301 https://$server_name$request_uri;是关键:保留原始域名和完整路径
示例配置:
server {listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
避免硬编码域名,提升可维护性
如果写死 https://example.com,换域名或加子域时就得改多处。用 $server_name 自动取当前匹配的域名,既安全又灵活。注意:它只返回第一个匹配的 server_name,多域名共用时建议确保顺序合理,或改用 $host(来自请求头,更贴近用户实际访问地址)。
更稳妥的写法(尤其适合泛域名或 CDN 场景):
但要注意:$host 可被客户端伪造,若对安全性要求极高且能控制访问入口,优先用 $server_name;若需支持多域名无差别跳转,$host 更实用。
确认 HTTPS server 已正确配置 SSL
return 301 只负责跳转,不提供加密。必须确保另一个 server 块已监听 443 端口,并完成以下配置:
-
listen 443 ssl http2;(启用 HTTP/2 提升性能) -
ssl_certificate和ssl_certificate_key指向有效的证书文件 - 建议加上
ssl_protocols TLSv1.2 TLSv1.3;和基础安全头(如 HSTS)
没有正确的 HTTPS server,用户跳过去会看到连接失败或证书错误,跳转就失去意义。
测试与验证要点
修改配置后务必执行 nginx -t 检查语法,再 nginx -s reload 生效。验证时关注三点:
- 访问
http://example.com/some/path是否 301 跳转到https://example.com/some/path(路径不能丢失) - 检查响应头中
Location字段是否准确,无多余斜杠或协议错误 - 用 curl -I 或浏览器开发者工具查看状态码,确认是
301 Moved Permanently,不是 302
如果是开发环境,可临时把 301 改成 302 测试,避免浏览器缓存干扰。


















