301 是什么
301 Moved Permanently 表示目标资源已经永久移动到新的地址:客户端与搜索引擎应当更新链接,后续请求直接使用新地址。RFC 9110 §15.4.2 把它归为重定向类,除了给出新地址外不携带业务语义。它是站点迁移、域名更换、明文升级到加密访问的标准做法,但也正因为「永久」这一语义,浏览器与搜索引擎会长期缓存它,一旦配错很难回滚。
基本信息
| 名称 | 301 Moved Permanently(RFC 9110 §15.4.2) |
|---|---|
| 作用 | 永久重定向到新地址 |
| 关键头 | 位置头给出目标地址 |
| 缓存 | 可被长期缓存,由缓存指令决定时长 |
| 方法影响 | 历史实现常把非读取方法改写为读取方法 |
典型使用场景
- 全站升级到加密访问:明文入口统一跳转到加密地址
- 更换主域名:旧域名整体指向新域名并保留路径
- 站点改版导致路径变化:旧路径逐条指向新路径
- 合并重复内容:把多个入口指针集中到一个规范地址
- 下线测试域名:指向正式环境而不再承载流量
明文升级加密访问
明文升级加密访问
server {
listen 80;
server_name example.com;
# 保留原始路径与查询串,避免用户跳到首页后丢失目标页面
return 301 https://$host$request_uri;
}重定向码怎么选
| 状态码 | 性质 | 方法是否保持 | 适用 |
|---|---|---|---|
| 301 | 永久 | 多数实现会改成读取方法 | 站点迁移、升级加密访问 |
| 302 | 临时 | 同样可能被改写 | 临时活动页,兼容旧客户端 |
| 303 | 临时 | 强制改成读取方法 | 提交之后跳转到结果页 |
| 307 | 临时 | 保持原方法与请求体 | 接口临时搬家 |
| 308 | 永久 | 保持原方法与请求体 | 接口永久迁移且要求保持语义 |
验证跳转链是否如预期
验证跳转链是否如预期
curl -sIL https://example.com/old | grep -iE '^HTTP|^location' # 只看状态行与目标地址,不下载内容
curl -sI http://example.com/ | grep -i location # 确认明文入口跳到了加密地址且保留了路径永久重定向会被浏览器与搜索引擎长期记住:拿它做临时活动跳转,活动结束后仍有大量用户被导到旧目标。临时跳转请用临时码,别图省事用永久码。
迁移前先把解析记录的缓存时间调小,迁移时保证旧路径逐条对应新路径,迁移后再观察一段时间访问日志。只做首页跳转会让已收录的深层页面全部指向同一个地址,权重与用户体验都会受损。
上线检查清单
- 逐条列出旧路径到新路径的映射,确认没有遗漏之后再切换
- 用能自动跟随跳转的命令验证链路,确认最终落在预期地址上
- 检查跳转是否保留了原始路径与查询串,避免用户丢失目标页面
- 确认旧域名仍保留解析与证书,否则连跳转本身都建立不了连接
- 切换后观察一段时间访问日志,确认旧地址上的请求量逐步收敛
跳转链为什么影响体验
| 现象 | 影响 |
|---|---|
| 跳转链过长 | 每多一跳就多一次往返,移动网络下等待感明显 |
| 跳转后丢参数 | 用户点开深层页面却落在首页,只能重新寻找 |
| 跳转与缓存叠加 | 旧规则被长期记住,回滚后仍被导走 |
临时还是永久怎么判断
- 先问自己一个问题:一年后这个旧地址还会生效吗?答案是会,才使用永久码
- 活动页、灰度入口、对照实验一律用临时码,下线时不会在用户端留下记忆
- 确需永久跳转时同步更新站内链接与站点地图,别让系统长期依赖跳转