使用 `return 301 https://$server_name$request_uri;` 是 Nginx 中实现 HTTP 强制跳转 HTTPS 最直接、最高效的方法之一。
核心原理是:为 Nginx 增加一个监听 80 端口的 `server` 块,专门用来捕获所有 HTTP 请求,然后返回一个 301 永久重定向,将用户导向对应的 HTTPS 地址。
一、具体配置步骤
1. 找到配置文件:Nginx 的主配置文件通常位于 `/etc/nginx/nginx.conf`,或者站点配置文件在 `/etc/nginx/sites-available/` 目录下。
2. 编辑配置:在配置文件中,为你的域名创建一个或修改现有的、监听 80 端口的 `server` 块,内容如下:
```nginx
server {
listen 80;
# 监听所有IPv4和IPv6的80端口
# listen [::]:80;
# 替换为你的域名
server_name yourdomain.com www.yourdomain.com;
# 核心跳转指令:返回301,重定向到HTTPS
return 301 https://$server_name$request_uri;
}
```
代码说明:
`listen 80;`:指示 Nginx 监听所有发往 80 端口的 HTTP 请求。
`server_name`:指定这条规则适用的域名。
`return 301`:向客户端返回 301 永久重定向状态码。如果你只是临时测试,可能需要改回 HTTP,可以先用 302 临时重定向。
`https://$server_name$request_uri`:这是重定向的目标地址。
`$server_name`:是一个 Nginx 内置变量,会自动替换为当前请求的域名,也就是你 `server_name` 里配置的值。
`$request_uri`:会保留原始请求中的完整路径和查询参数(例如 `/page?name=value`)。
3. 配置 HTTPS 服务:确保你已经有一个监听 443 端口的 `server` 块来处理 HTTPS 流量。这个块里需要配置好 SSL 证书。
4. 测试并重载配置:
运行 `sudo nginx -t` 测试配置文件语法是否正确。
如果测试通过,运行 `sudo systemctl reload nginx` 或 `sudo nginx -s reload` 使新配置生效。
二、注意事项
`$host` vs `$server_name`:上面用的是 `$server_name`,你也可以用 `$host`。`$host` 取自客户端请求的 `Host` 头,而 `$server_name` 取自配置文件。大多数情况下两者一样,但用 `$server_name` 更可控,能避免 HTTP Host 头攻击的潜在风险。
避免重定向循环:确保重定向逻辑只针对 80 端口的 HTTP 流量生效,不要错误地在 443 端口的 HTTPS `server` 块里也配置跳转。
考虑启用 HSTS:在 HTTPS 的 `server` 块中添加 `add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;` 可以强制浏览器在接下来的一年里,只通过 HTTPS 访问你的网站,进一步提升安全性。
三、总结
总而言之,使用 `return 301 https://$server_name$request_uri;` 配置 HTTP 到 HTTPS 的强制跳转,是 Nginx 中一种标准、高效且推荐的做法。它配置简单,能完美保留原始请求的 URL 路径,并对搜索引擎友好。