rewrite指令配合permanent标志可实现http 301永久重定向,用于域名迁移、url规范化等场景,语法为rewrite regex replacement permanent,目标含完整url时支持跨域跳转,推荐置于server块顶层以确保优先执行。

在 Nginx 中,使用 rewrite 指令配合 permanent 标志,可以实现 HTTP 301 永久重定向。这常用于域名迁移、URL 规范化或旧链接更新等场景。
rewrite + permanent 的基本语法
rewrite 指令用于匹配并重写请求 URI,permanent 是其内置的标记之一,表示返回 301 状态码。语法如下:
rewrite ^/old-path$ /new-path permanent;
该规则会将访问 /old-path 的请求,301 跳转到 /new-path(同域名下)。注意:目标路径默认是相对当前域名的,不带协议和主机名。
实现跨域名永久跳转
如果要跳转到其他域名,需在目标 URL 中显式写出完整地址(含 http:// 或 https://),Nginx 会自动识别并返回 301:
- rewrite ^/blog/(.*)$ https://new-site.com/articles/$1 permanent;
- rewrite ^/2023/(.*)$ https://archive.example.com/$1 permanent;
⚠️ 注意:使用完整 URL 时,Nginx 不再做路径拼接,而是直接重定向到指定地址;正则捕获的 $1 仍可安全引用。
放在 server 块还是 location 块?
推荐将 rewrite ... permanent 放在 server 块顶层(即不在任何 location 内),原因如下:
- 避免因 location 匹配顺序导致规则未生效
- 更早触发重定向,减少不必要的处理开销
- 语义清晰:这是全局性的 URL 映射变更
例如,在 server 块中直接写:
server {
listen 80;
server_name old.com;
rewrite ^/(.*)$ https://new.com/$1 permanent;
}
常见陷阱与注意事项
- 不要混用
return 301和rewrite ... permanent处理同一类需求——return更简洁高效,尤其对简单跳转 - 若 rewrite 后目标路径以
/开头但没写协议,Nginx 默认按当前 scheme + host + path 构造跳转地址 - 浏览器会缓存 301 跳转,测试时建议用无痕窗口或清除重定向缓存(
curl -I查看状态码最可靠) - 确保 SSL 配置正确,尤其是跳转到 HTTPS 时,避免因证书问题导致跳转失败











