apache 301重定向核心目标是旧url精准跳转至对应新url,确保权重不丢失、无404、无循环跳转;需分域名级、页面级、目录级三类场景配置,全部基于.htaccess实现,强调路径保留、查询字符串清理、规则顺序及测试验证。

企业官网改版时,Apache 的 301 重定向核心目标是:把旧 URL 全部精准跳转到对应新 URL,不丢权重、不产生 404、避免循环跳转。关键不是“全站跳首页”,而是“一一映射”或“规则化迁移”。
以下分三类常见场景,直接给出可落地的配置方式(全部基于 .htaccess,无需修改主配置,适合大多数虚拟主机和宝塔/Apache 环境):
✅ 一、整站域名级跳转(如 old.com → new.com)
适用于品牌升级、换域名,所有路径保持不变,只换域名:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?old\.com$ [NC]
RewriteRule ^(.*)$ https://www.new.com/$1 [R=301,L]
-
^www\.?old\.com$同时匹配old.com和www.old.com -
$1保留原始路径(如/about.html→/about.html) - 强烈建议加
https://和www.显式写出,避免协议/子域歧义
✅ 二、页面级路径变更(如 /product.php?id=123 → /products/123)
Apache 默认不解析问号后参数,必须用 RewriteCond %{QUERY_STRING} 单独捕获:
RewriteEngine On
# 匹配 /product.php?id=123 → 跳转到 /products/123
RewriteCond %{QUERY_STRING} ^id=([0-9]+)$
RewriteRule ^product\.php$ /products/%1? [R=301,L]
# 匹配 /news/show.php?nid=567 → /articles/567.html
RewriteCond %{QUERY_STRING} ^nid=([0-9]+)$
RewriteRule ^news/show\.php$ /articles/%1.html? [R=301,L]
-
%1表示RewriteCond中第一个括号捕获的内容(即数字) - 结尾的
?是关键:清空原查询字符串,否则会跳成/articles/567.html?nid=567
✅ 三、目录结构扁平化(如 /old/about/ → /about.html)
用 RedirectMatch 更简洁,支持正则:
RedirectMatch 301 ^/old/(.*)\.html$ /$1.html
RedirectMatch 301 ^/old/services/(.*)$ /services/$1
RedirectMatch 301 ^/old/blog/([0-9]{4})/([0-9]{2})/(.*)$ /blog/$1/$2/$3
-
^/old/(.*)\.html$匹配/old/page.html→/page.html - 注意末尾无斜杠时别漏掉
\.html,否则可能误伤图片/CSS等资源
⚠️ 避坑提醒(企业级改版最常翻车点)
-
不要把 WordPress 的重写块包进去:
.htaccess中# BEGIN WordPress和# END WordPress之间的内容由程序自管,你的重定向规则务必写在这两行之外(推荐放在最顶部) - 测试顺序很重要:Apache 自上而下执行,把精确匹配(如单页)放前面,泛匹配(如整站)放后面,否则会被覆盖
-
禁用缓存再测试:浏览器和 CDN(如 Cloudflare)会缓存 301,测试时用隐身窗口 +
curl -I 域名/旧路径查状态码 -
上线前做映射表核对:至少抽测 20 个高频旧 URL,确认跳转目标正确、状态码为
301、无多跳或循环
不复杂但容易忽略细节。改版后持续观察搜索控制台的“已删除/未找到”报告,及时补漏即可。









