最推荐使用 return 301 https://$host$request_uri;,因 $host 取自请求 Host 头(自动小写去端口),$request_uri 保留完整路径和参数,确保跳转准确且支持多域名;而 $http_host 可能含非法端口,$uri 不含参数易导致丢失查询字符串。

在 Nginx 中配置 HTTP 到 HTTPS 的重定向时,正确使用主机名相关变量是保证跳转地址准确的关键。最常用、也最推荐的方式是:return 301 https://$host$request_uri;。它能原样保留用户访问的域名和完整路径,避免硬编码导致的跳转错误或 SEO 问题。
$host 是什么?怎么工作的?
$host 变量取自 HTTP 请求头中的 Host 字段,代表用户实际输入或点击的域名(如 www.example.com 或 example.com),不带端口。如果请求没带 Host 头,Nginx 会退而使用当前 server 块中 server_name 的第一个值。
- 它天然支持多域名共用同一配置:无论用户访问的是
a.com还是b.net,都能各自跳转到对应 HTTPS 地址 - 不依赖 DNS 解析或服务器本地 hostname,完全由客户端请求决定
- 与
$http_host不同,$host会自动小写并去掉端口,更符合标准 URL 格式
为什么不用 $http_host?
$http_host 直接复制请求头的原始 Host 值,可能包含端口号(如 example.com:8080)或大小写混杂,直接拼进 HTTPS URL 会导致无效链接。
- 例如:用户访问
http://example.com:8080/path,用$http_host会跳转成https://example.com:8080/path—— HTTPS 默认走 443 端口,带 :8080 就失败 -
$host自动剥离端口,结果是https://example.com/path,安全可靠
$request_uri 和 $uri 的区别要分清
重定向必须用 $request_uri,不能用 $uri。
-
$request_uri包含原始请求的完整路径 + 查询参数(如/login?next=/admin) -
$uri是经过内部处理后的路径,不含查询参数,也不反映重写前的原始请求 - 漏掉
$request_uri就等于丢掉 ? 后面的所有参数,用户登录、搜索、分享链接都会失效
实际配置示例(精简安全版)
在 HTTP server 块中写:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
- 不需要额外 location 或 rewrite 指令,简单高效
- 多个
server_name共享同一跳转逻辑,无需重复配置 - 返回 301 表示永久重定向,有利于搜索引擎更新索引









