Nginx location 中重定向必须用 rewrite 指令配合 redirect 或 permanent flag,不支持直接 redirect_to 语法;需明确跳转类型、目标路径(相对或完整URL),注意匹配顺序、正则书写及参数处理,并验证语法与状态码。

在 Nginx 的 location 块中配置重定向,核心是使用 rewrite 指令配合合适的 flag(如 redirect 或 permanent),而不是直接“配置重定向后的 URL 地址”。Nginx 不支持像 location /old { redirect_to /new; } 这样的语法;必须通过 rewrite 规则显式定义匹配逻辑与跳转目标。
明确重定向类型:临时 vs 永久
选择 flag 决定 HTTP 状态码和浏览器行为:
-
redirect→ 返回 302 Found,适合测试、临时维护或 A/B 测试场景 -
permanent→ 返回 301 Moved Permanently,搜索引擎会更新索引,适用于域名迁移、URL 结构调整等长期变更
重定向目标必须是完整 URL 或相对路径
rewrite 的替换内容可以是:
- 相对路径(如
/products/$1)→ 仅改写 URI,不带协议和主机名,适用于同站内跳转 - 完整 URL(如
https://example.com/products/$1)→ 自动触发 302/301 跳转,浏览器地址栏会变化 - 注意:若替换内容以
http://或https://开头,Nginx 会自动启用外部重定向,此时 flag 可省略(但建议显式写出以提高可读性)
location 匹配与 rewrite 执行顺序很关键
rewrite 在 location 内部执行,且受 flag 控制后续流程:
- 用
permanent或redirect时,Nginx 直接返回响应,不再执行后续指令(如 proxy_pass) - 避免在同一个 location 中混用 rewrite + proxy_pass,除非用
last或break控制内部重写(非浏览器跳转) - 示例:把旧产品页
/item?id=123永久跳转到新路径
location /item {
rewrite ^/item\?id=(\d+)$ /products/$1? permanent;
}
注意:? 后的查询参数在正则中需转义为 \?,末尾加 ? 表示丢弃原始参数;不加则自动追加。
常见陷阱与检查点
- 正则未加锚定(
^和$)可能导致意外匹配,例如rewrite /api /v2/api会匹配所有含/api的路径 - location 使用
=精确匹配时,rewrite 中的 URI 必须完全一致,否则不生效 - 重定向后 URL 中的中文或特殊字符需确保编码一致,必要时用
rewrite ... last;配合内部 location 处理解码 - 修改后务必运行
nginx -t验证语法,并用curl -I检查返回状态码是否符合预期


















