Nginx中location块301跳转适用于局部路径迁移,需在旧域名server块内配置,用return 301配合$request_uri保留参数,写死新域名更安全;路径结构变化时可用rewrite + permanent捕获重写,避免if嵌套和跨域误配。

在 Nginx 的 location 块中做 301 跳转到新域名,适用于局部路径迁移(比如只改某几个页面或目录),而不是全站换域名。它和 server 级跳转不同:location 是按 URL 路径匹配,不是按域名匹配,所以必须配合 server_name 指向旧域名来生效。
用 return 301 实现精准路径跳转
这是最推荐的方式,语法简洁、性能高、不依赖正则解析,且能完整保留原始参数。
- 在旧域名的 server 块里写 location,例如:
server_name old.com; - 用
return 301直接拼新地址,$request_uri自动带路径和查询参数 - 不要用
$scheme://$host,避免协议/主机名污染,写死新域名更安全
示例:把旧站所有 /blog/xxx 请求跳到新域名对应路径
server {
listen 80;
server_name old.com www.old.com;
location ^~/blog/ {
return 301 https://new.com$request_uri;
}
}
需要改写路径结构时用 rewrite + permanent
当新旧路径不一致(比如 /product/123.html → /item/123),就得靠正则捕获重写。注意 rewrite 后加 permanent 才是 301。
- rewrite 在 location 内执行,
$1引用括号捕获的内容 - 结尾加
permanent显式返回 301,不能只写redirect(那是 302) - 如果要保留查询参数,显式加上
$args,因为 rewrite 默认不继承
示例:/product/123.html → https://new.com/item/123?utm_source=old
location ~ ^/product/(\d+)\.html$ {
return 301 https://new.com/item/$1?$args;
}
常见避坑点
location 中做跨域跳转容易出错,这几个细节必须核对:
- 确保这个 location 所在的 server 块监听的是旧域名,否则根本不会触发
- 不要在新域名的配置里写跳旧域名的 location,逻辑反了
- 避免嵌套 if + rewrite,Nginx 官方明确不建议,易导致多跳或变量失效
- 测试时用
curl -I http://old.com/product/123.html看响应头是否含301 Moved Permanently和正确Location
什么时候不该用 location 做域名跳转
如果整个旧域名都要迁走,就别在 location 里折腾——直接用独立 server 块配 return 301 更稳妥。location 适合以下情况:
- 只迁移部分路径(如仅 /admin、/api/v1)
- 多个旧域名共用一套配置,但只有其中某些路径需特殊跳转
- 需要结合其他指令(如限流、鉴权)再跳转


















