在 nginx 中,配合 redirect 与 permanent 跳转的核心做法是在 rewrite 指令的最后一个参数指定状态码。使用 redirect 会返回 http 302 临时重定向,而 permanent 会返回 http 301 永久重定向。这决定了浏览器和搜索引擎对目标 url 的处理方式及缓存策略。

如何配置临时跳转(302)
要实现临时跳转,需在 rewrite 指令末尾添加 redirect 关键字。Nginx 接收到请求后,会立即中断当前处理流程,并向客户端发送包含新地址的 302 响应头。这种跳转通常用于 A/B 测试、维护期页面或尚未确定的迁移路径,因为客户端不会将旧地址缓存为永久有效。

server {
listen 80;
server_name example.com;
# 匹配 /old-path 并临时跳转到 /new-path
rewrite ^/old-path$ /new-path redirect;
}上述配置中,当用户访问 /old-path 时,服务器返回 302 Found。浏览器地址栏会更新为 /new-path,但搜索引擎爬虫仍会将权重保留在 /old-path 上,且下次请求可能再次命中该规则。若需验证,可使用 curl 命令:curl -I http://example.com/old-path,观察返回头中的 HTTP/1.1 302 Found 和 Location: /new-path。
如何配置永久跳转(301)
要实现永久跳转,需在 rewrite 指令末尾添加 permanent 关键字。Nginx 会返回 HTTP 301 Moved Permanently 状态码。这种跳转适用于域名更换、URL 结构永久性优化或废弃旧版接口。客户端和搜索引擎会将旧 URL 从索引中移除,并将所有权重传递给新 URL。

server {
listen 80;
server_name old.example.com;
# 匹配所有请求并永久跳转到新域名
rewrite ^(.*)$ https://new.example.com$1 permanent;
}在此配置中,任何访问 old.example.com 的请求都会被永久重定向到 https://new.example.com 对应的路径。注意 $1 变量保留了原始请求的路径部分,确保深层链接也能正确跳转。使用 curl 验证时,应看到 HTTP/1.1 301 Moved Permanently。由于 301 会被浏览器强缓存,修改此规则后可能需要清除浏览器缓存或使用无痕模式测试,否则可能看不到预期效果。
基于正则捕获组的复杂跳转场景
当需要基于 URL 中的特定参数或路径段进行动态跳转时,rewrite 的正则捕获组功能非常关键。例如,将带有 ?id=123 查询参数的旧 API 端点永久迁移到新的 RESTful 风格 URL。这种情况下,必须确保捕获组能准确提取所需数据,并在重写目标中正确引用,同时保持 permanent 标志以传递 SEO 权重。
server {
listen 80;
server_name api.example.com;
# 将 /api/v1/user?id=123 永久重定向到 /users/123
rewrite ^/api/v1/user\?id=(\d+)$ /users/$1 permanent;
}该配置中,(\d+) 捕获了 id 的值,并在重写目标中通过 $1 引用。如果请求是 /api/v1/user?id=456,它将永久跳转到 /users/456。若未加 permanent,则默认为内部重定向(无状态码返回),这不符合外部跳转需求。务必测试边界情况,如缺少 id 参数或 id 非数字时,该规则不会匹配,请求将继续由后续配置处理,避免意外中断。


















