301 与 302 重定向的区别和 Nginx 写法
发布时间:2025-10-09 15:08       
更新时间:2025-10-09 21:31
301 和 302 在浏览器里看不出差别,都是跳到新地址,但搜索引擎对两者的处理完全不同。这一字之差,决定旧网址积累的权重能不能带走。
一、本质区别
301 Moved Permanently 表示永久迁移。搜索引擎抓到 301 后,会把旧网址的索引与排名信号合并到新网址,外链价值大体跟随转移。302 Found 表示临时借用,搜索引擎认为旧地址还会恢复,索引与权重继续留在旧地址。顺带一提 308 状态码:语义与 301 相同,但要求请求方法不变,POST 不会被改成 GET,接口地址迁移用它更稳。
选型的判断标准只有一条:这次跳转是永久的,还是临时的。
二、什么时候用哪个
适合 301 的场景:域名更换;http 强制跳 https;带 www 与不带 www 的归一;栏目 URL 调整后的旧链接迁移。
适合 302 的场景:大促临时跳活动页,活动结束要还原;维护页、灰度测试的临时分流。
把本该 302 的写成 301,临时页面反而占住正式页面的排名,事后清理非常麻烦——这是新手最常见的重定向事故。另外跳转链能短则短:a 跳 b、b 再跳 c 的链式重定向会拖慢抓取,多余的中间层合并成一条直达。
三、Nginx 写法
rewrite 方式:
```
# 301 永久跳转
rewrite ^/old/(.*)$ https://example.com/new/$1 permanent;
# 302 临时跳转
rewrite ^/promo/(.*)$ /activity/$1 redirect;
```
整站跳转更适合用 return,简洁且性能更好:
```
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
```
permanent 对应 301,redirect 对应 302,return 后直接写状态码,语义一目了然。
四、验证方法
```
curl -sI http://example.com/old-page | head -3
```
看返回行的状态码和 Location 头即可。浏览器地址栏跳转成功不代表状态码正确,一定要用 curl 确认;已有页面也可以用在线工具查搜索引擎缓存的判定结果。整批迁移时写个循环脚本把 URL 列表挨个过一遍,人工抽查总要漏几条。
改动前先把旧 URL 列表存档,上线后抽查主要入口页。301 一旦被搜索引擎确认为永久关系,再拆回来要重新积累,宁可在测试环境多验一遍。