文档首页> 技术教程> 301 与 302 重定向的区别和 Nginx 写法

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 一旦被搜索引擎确认为永久关系,再拆回来要重新积累,宁可在测试环境多验一遍。