return 301 是最简洁高效的重定向方式,适用于域名变更、HTTPS迁移等场景,需正确使用 $request_uri 保留路径与参数,多域名可共用 server_name,配置后须用 nginx -t 验证并清缓存测试。

按需求选对配置位置
改版重定向不是随便加一行就行,得看你要跳转什么:
- 整个旧域名 → 新域名:放在监听 80 的 server 块里,server_name 设为旧域名
- HTTP → HTTPS:同样放 listen 80 的块中,目标地址写死 https://,避免 $scheme 变成 http
- www 和非 www 统一:比如把 example.com 全跳到 www.example.com,server_name 写 example.com 即可
- 目录级迁移(如 /old-path/ → /new-path/):用 location 匹配路径,再 return 301,比 if + rewrite 更安全
保留原始路径和参数是关键
用户访问 /products?id=123,跳过去也得是 /products?id=123,否则 SEO 权重和用户意图都会断掉。
必须带上 $request_uri —— 它包含路径 + 查询字符串(? 后面的部分),比 $uri 更完整。
错误写法:return 301 https://new.com/;(丢掉了所有路径和参数)
正确写法:return 301 https://new.com$request_uri;
多旧域名合并跳转更省事
如果改版涉及多个旧域名(比如 old1.com、old2.net、www.old1.com),不用写多个 server 块:
- 把它们全列在
server_name后面,空格分隔 - 只写一条
return 301,Nginx 自动匹配任一命中即生效 - 示例:
server_name old1.com old2.net www.old1.com;
验证和避坑要点
- 改完先运行
nginx -t检查语法,再nginx -s reload生效 - 用
curl -I http://old.com/some-page看响应头,确认有301 Moved Permanently和正确的Location - 浏览器测试前清缓存——301 会被强缓存,临时调试可用 302 替代
- 别在 listen 443 的 server 块里写 HTTP 跳转逻辑,容易引发循环重定向
- 宝塔用户务必改「网站→设置→配置文件」,别碰全局 nginx.conf,否则重启后失效


















