网站 301/302 重定向怎么做才不掉权?Nginx/Apache 规则与常见坑
网站 301/302 重定向怎么做才不掉权?Nginx/Apache 规则与常见坑
我见过不少站点改结构/换域名后“看起来一切正常”,但过两周发现:收录开始乱、排名在抖、首页权重分散。追根究底,很多问题都出在重定向没设计好。
这篇文章按实战来讲四件事:
1) 301 和 302 到底怎么选(别再纠结)\
2) Nginx/Apache 最常用的几套规则(可直接抄)\
3) 5 个高频翻车坑(循环跳转、链路打架、跳首页等)\
4) 上线前怎么抽样验证(用命令一眼看出来)
1)301 和 302 怎么选?给你一个“不会错太离谱”的口诀
- 301(永久):地址“确定要变了”,以后就按新地址走(改域名、改 URL 结构、统一 www/非 www、http→https)
- 302(临时):短期活动、短期维护、A/B 测试、临时引流
如果你是做 SEO 的站点,大多数“长期变更”都该用 301。302 用多了,会让搜索引擎更谨慎地迁移权重。
2)先把目标定死:你最终到底想要哪个 URL?
重定向翻车,80% 是因为目标没定死:
- 带不带
www(二选一) http还是https(建议统一https)- 末尾要不要
/(目录类 URL 最好统一)
我一般建议:
- 全站 https
www与非www选一个(看历史收录/外链在哪边更多)- 统一后尽量让“旧地址到新地址”只跳一次(不要 2~3 次连续跳转)
3)Nginx:常用重定向模板(直接抄)
3.1 www → 非 www
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
如果你最终目标是 https,把上面的 http:// 换成 https://。
3.2 http → https
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
3.3 “一次到位”:http://www → https://非www(推荐)
很多人会写两段规则导致两次跳转。你可以直接一次到位:
server {
listen 80;
server_name www.example.com;
return 301 https://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
你也可以把两段合并成一段用正则,但我更喜欢这种“看得懂、好维护”的写法。
3.4 旧目录 → 新目录(改 URL 结构)
比如把 /old/xxx 迁到 /new/xxx:
location ^~ /old/ {
rewrite ^/old/(.*)$ /new/$1 permanent;
}
3.5 大规模 URL 映射(几百条以上)怎么做?
如果你是“改栏目路径/改伪静态规则”,可能会遇到一堆旧 URL 需要一对一映射。
我的建议是:别在 rewrite 里写到眼花,整理一份映射表,然后逐步验证。
- 数量不大:手工写几条
rewrite没问题 - 数量很大:用
map(或在程序层做 301)更可控
示意(Nginx map 思路,仅供参考):
map $request_uri $redirect_to {
default "";
/old-a.html /new-a.html;
/old-b.html /new-b.html;
}
server {
location / {
if ($redirect_to != "") {
return 301 $redirect_to;
}
# 正常业务处理...
}
}
4)Apache(.htaccess)常见写法(示意)
RewriteEngine On
# http -> https
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# www -> non-www
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,R=301]
Apache 环境差异比较多(虚拟主机/面板规则/站点根目录不同),如果你发现规则没生效,优先确认 .htaccess 是否真的被加载。
5)最容易翻车的 5 个坑(我踩过/见过的)
坑 1:规则顺序错 → 循环跳转
你同时做 http→https、www→非www、路径改写时,很容易互相打架。
解决办法:目标先定死,然后尽量做到“一跳到位”。
坑 2:多处同时写跳转(CDN / Nginx / 程序)
很多站点前面还有 CDN/负载均衡,后台程序里也可能有强制跳 https。
这会导致:你在 Nginx 里写了规则,但实际跳转来源可能是 CDN 或程序。
建议:把跳转逻辑集中在一个地方(通常是最外层入口:CDN 或 Nginx)。
坑 3:把所有旧 URL 粗暴跳首页
这类“偷懒跳法”对用户体验很差,也会让搜索引擎觉得你在糊弄。
更好的做法:
- 能一对一映射就一对一
- 找不到对应内容就返回 404/410(删除内容用 410 更合理)
坑 4:改完没更新站内链接/站点地图
你跳转做得再完美,如果站内链接还在指向旧 URL,爬虫仍然会反复抓旧地址。
改完记得:
- 更新站点地图(sitemap)
- 更新站内内链
- 检查 canonical(规范链接)是否指向最终地址
坑 5:跳转链太长(2~3 次以上)
跳转链越长,抓取越浪费,用户也更慢。
建议用命令测一下:
curl -I -L http://example.com/old-url
如果你看到 Location 连续跳了好几次,就要合并规则。
6)上线前抽样验证清单(建议你照做)
我一般会抽 50~100 条旧 URL(覆盖:文章页、分页页、分类页、tag页),逐条验证三件事:
- 返回码是否是 301/302(符合预期)
- 最终落地 URL 是否正确(没有中途多跳)
- 页面是否能正常打开(不是跳到 404/首页)
命令行更快:
# 看返回码与 Location
curl -I http://example.com/old-url
# 看重定向链
curl -I -L http://example.com/old-url
如果你准备迁域名,建议在 Search Console 里提交新站点地图,并持续观察“覆盖率/抓取错误/重定向错误”。
总结
重定向不是“能跳就行”,而是要:目标明确、规则可控、上线可验证。
你按本文把最终 URL 定死、把规则做到一跳到位、把抽样检查跑完,掉权风险会小很多。
