重写与重定向的区别
七层入口可以配置两类动作:路径重写(改写请求路径后再转发给后端)与重定向(直接返回 3xx 让客户端跳到新地址)。重写对客户端透明,后端看到的是改写后的路径,适合外部路径与后端接口不一致的情况;重定向会改变客户端地址栏,适合域名迁移与目录调整。
基本信息
| 重写 Rewrite | 改写路径后转发,客户端无感知 |
|---|---|
| 重定向 Redirect | 返回 301 或 302,客户端自行跳转 |
| 典型用途 | 重写用于路径映射,重定向用于域名与目录迁移 |
| 前提 | 重写规则要与后端路由一致 |
| 验证方式 | 从客户端发起请求并核对后端日志中实际收到的路径 |
典型使用场景
- 外部路径 /v1 对应后端 /api/v1,用重写做映射
- 域名迁移时把旧域名 301 到新域名,保留搜索权重
- HTTP 统一跳转到 HTTPS
- 旧目录结构调整后保留跳转,避免用户拿到 404
- 多版本接口共存时用重写把新路径指向新后端
验证重写与跳转行为
验证重写与跳转行为
# 验证重写:关注返回码与后端日志中的路径
curl -s -o /dev/null -w 'code=%{http_code}\n' http://<LB地址>/v1/ping
# 验证重定向:关注 Location 头
curl -sI http://<LB地址>/old-path | grep -i -E 'HTTP/|location'
# 检查是否存在跳转循环:连续跟随后确认最终落点
curl -sIL http://<LB地址>/old-path | grep -i -E '^HTTP/|location'两类动作对照
| 动作 | 客户端感知 | 典型场景 |
|---|---|---|
| 重写 Rewrite | 无 | 外部路径与后端接口不一致 |
| 重定向 Redirect | 地址栏改变 | 域名迁移、目录调整 |
| 301 永久 | 可能被浏览器长期缓存 | 确定不再回退的迁移 |
| 302 临时 | 不长期缓存 | 灰度与临时跳转 |
重写规则与后端路由强耦合:后端路径调整时要同步检查入口规则,否则会出现整片路径 404。
使用 301 前要确认迁移是最终态:浏览器会长期缓存永久跳转,回滚时用户可能仍被跳到旧目标。
变更后的验证
重写与跳转变更后要同时验证返回码、Location 头与后端日志中的实际路径,只测其中一项容易漏掉问题。