301 重定向是 .htaccess 中最常见的配置之一。它将访客和搜索引擎从旧 URL 永久重定向到新 URL,在站点迁移、URL 重构或安全升级(HTTP → HTTPS)期间保留 SEO 排名并确保流畅的用户体验。
301 vs 302:有什么区别?
在深入了解规则之前,先了解应使用哪种重定向类型:
- 301 永久移动 — URL 已永久移动。搜索引擎将约 90–99% 的链接权重传递到新 URL 并更新索引。
- 302 临时跳转 — URL 被临时重定向。搜索引擎继续索引原始 URL,不传递链接权重。
永久更改(HTTP→HTTPS、www→non-www、域名迁移、URL 重构)使用 301;A/B 测试或维护页面等临时情况使用 302。
修改前请务必备份您的 .htaccess 文件。单个语法错误可能导致整个网站出现 500 内部服务器错误。在 DirectAdmin 中,进入文件管理器 → public_html/.htaccess → 先下载一份备份。
规则 1:重定向单个 URL
最简单的重定向——将某个特定 URL 指向另一个。适用于重命名页面或文章时使用。
Redirect 301 /old-page.html https://asiagb.com/new-page.html
或使用 mod_rewrite(更灵活):
RewriteEngine On RewriteRule ^old-page\.html$ /new-page.html [R=301,L]
规则 2:HTTP 转 HTTPS(强制 SSL)
将所有 HTTP 流量重定向到 HTTPS——安装 SSL 证书后确保安全和 SEO 排名的必要步骤。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
此规则检查 HTTPS 是否关闭,然后将请求改写为使用 HTTPS,同时保留完整的路径和查询字符串。
规则 3:www 转 non-www
将 www.yourdomain.com 重定向到 yourdomain.com,将域名权重集中到单一规范版本。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
%1 从上面的条件中捕获不含 www. 的域名部分。
规则 4:non-www 转 www
与上面相反——将 yourdomain.com 重定向到 www.yourdomain.com。请始终统一使用一种规范形式。
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
规则 5:重定向整个文件夹
将文件夹内所有页面重定向到新位置。适用于对网站结构进行重组后使用。
RewriteEngine On RewriteRule ^old-blog/(.*)$ /new-blog/$1 [R=301,L]
(.*) 捕获组保留了文件路径,因此 /old-blog/post-1.html → /new-blog/post-1.html。
规则 6:完整域名迁移
将所有流量从旧域名重定向到新域名。适用于品牌更名或迁移到新域名时使用。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$ [NC]
RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]
将此规则放在 olddomain.com 的 .htaccess 文件中,可同时处理 www 和 non-www 两种形式。
规则 7:带查询字符串的重定向
重定向含有特定查询参数的 URL。适用于从查询字符串 URL 改为简洁 URL 之后使用。
RewriteEngine On
RewriteCond %{QUERY_STRING} ^id=123$
RewriteRule ^product\.php$ /product/widget-pro? [R=301,L]
目标地址末尾的 ? 会从重定向后的 URL 中移除原始查询字符串。
规则 8:HTTP + www 同时转为 HTTPS + non-www
最完整的重定向方案——处理所有四种组合(http/https × www/non-www),并强制使用规范版本。
RewriteEngine On
# Force HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
# Force non-www
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
按顺序同时运行这两条规则。HTTPS 规则先触发,然后是 www 规则,覆盖所有四个入口。
测试您的重定向
添加重定向规则后,请务必验证其是否正常工作:
- 在终端使用 curl:
curl -I http://yourdomain.com/old-page.html— 检查是否出现HTTP/1.1 301和Location:响应头 - 使用浏览器开发者工具:Network 标签页 → 检查状态码链
- 使用
redirect-checker.org等在线工具检测重定向循环 - 测试后清除浏览器缓存——缓存的 301 可能持续生效
避免重定向链。如 A → B → C 的链式重定向会增加延迟并稀释链接权重。请始终直接重定向到最终目标:A → C。
.htaccess 常见错误
- 500 内部服务器错误 — .htaccess 语法错误。检查
[R=301,L]等标志周围是否有缺少空格或拼写错误 - 重定向循环 — 目标地址再次匹配了同一规则。添加
RewriteCond将目标排除在匹配之外 - 重定向不生效 —
mod_rewrite可能未启用。请联系技术支持或通过phpinfo()检查 - 重定向到错误的 URL — 检查捕获组
$1和反向引用%1——它们是不同的东西
更多 .htaccess 重定向规则
除上述八个核心规则外,实际迁移中往往还需要一些变体。以下示例涵盖整理网站 URL 时最常遇到的情况——强制使用单一规范域名、统一尾部斜杠,以及将旧页面映射到新页面。复制后将域名和路径替换为您自己的即可。
一次性强制 HTTPS + non-www(规范域名)
如果希望所有请求无论来源如何都以 https://yourdomain.com 结束,可将所有条件合并为一条规则:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://yourdomain.com/$1 [R=301,L]
[OR] 标志在请求"不是 HTTPS"或"带有 www"时触发规则,因此所有四个入口(http/https × www/non-www)通过单次重定向合并为一个规范 URL——最大限度减少重定向链。
统一尾部斜杠(添加或移除)
为保持 URL 一致性,请选择您的 URL 是否以 / 结尾并在全站强制执行。为目录添加尾部斜杠:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ /$1/ [R=301,L]
或者相反——移除尾部斜杠以保持 URL 简短:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
只能使用其中一个——切勿同时使用,否则两者相互冲突会造成重定向循环。
旧页面到新页面(一对一映射)
当您重命名文章或重构某个 URL 时,进行一对一映射,确保旧页面不会失去排名:
Redirect 301 /blog/old-article /blog/new-article-slug Redirect 301 /promo-2026.html /promotions.html
对于多个页面,使用 RedirectMatch 或逐行列出每个 Redirect 301,确保每个页面直接指向最终目标,而不经过中间跳转。
301 vs 302 vs 307:该如何选择
HTTP 有多种重定向状态码。最常用的三种是 301、302 和 307,每种都向浏览器和搜索引擎传递不同信息。选错可能损害 SEO 或破坏 POST 请求。
| 状态码 | 含义 | 传递链接权重 | 使用场景 |
|---|---|---|---|
| 301 | 永久移动 | 是(约90-99%) | 站点迁移、强制 HTTPS、www/non-www 规范化、URL 变更 |
| 302 | 临时跳转 | 否 | 维护页面、A/B 测试、临时促销 |
| 307 | 临时重定向(保留请求方法) | 否 | 需要保留 POST 方法的重定向(API、表单) |
307 的关键区别在于浏览器会保留原始 HTTP 方法(POST 仍为 POST),而 302 许多浏览器会将 POST 降级为 GET。因此,如果重定向的页面接收表单数据,请考虑使用 307。但对于普通内容网站的 SEO 而言,301 仍是首选。
301 重定向与 SEO
当您更改 URL 结构时,301 重定向是保留排名的关键工具。操作正确可保留已积累的权重;操作错误则可能失去全部 Google 流量。以下是 SEO 方面的注意事项:
- 传递链接权重 — 301 将页面的大部分链接权重从旧 URL 传递到新 URL,使新页面保留旧页面的排名能力。
- 防止内容重复 — 网站同时在 http/https 和 www/non-www 下提供服务,意味着同一内容有四个 URL 版本,Google 可能将其视为重复内容。用 301 强制使用单一规范 URL 可整合排名信号。
- 加快索引更新 — Googlebot 遇到 301 时,会逐步将搜索结果中的旧 URL 替换为新 URL。保持 301 数月直到索引完全更新。
- 避免重定向链 — 如 A → B → C 的重定向链会增加每次跳转的加载时间并稀释链接权重。始终将 A 直接映射到最终目标 C。
移动 URL 后,更新站点地图、修改内部链接直接指向新 URL,并将新 URL 提交至 Google Search Console 以加快重新索引。301 则负责处理您无法编辑的旧外部链接。
常见问题
301 和 302 对 SEO 有什么区别?
301 是永久移动:搜索引擎将大部分链接权重传递给新 URL 并更新索引。302 是临时重定向:搜索引擎继续索引原始 URL,不传递链接权重。站点迁移、URL 变更和强制 HTTPS 使用 301;仅在真正临时的情况下(如维护页面或 A/B 测试)使用 302。
如何修复 .htaccess 中的重定向循环?
重定向循环通常是因为目标地址仍匹配同一规则。添加 RewriteCond 将目标排除在匹配之外——例如在重写前检查 %{HTTPS} off 或 %{HTTP_HOST}——且不要将添加斜杠规则和移除斜杠规则同时使用。清除浏览器缓存(因为已缓存的 301 即使修复文件后仍会继续重定向),并在无痕模式下测试。
301 重定向会影响 SEO 排名吗?
会,正确操作时有积极影响。301 将约 90-99% 的链接权重从旧 URL 传递到新 URL,并在强制使用单一 HTTPS 及 www 或 non-www 版本时防止重复内容。避免重定向链(A → B → C),因为每次跳转都会增加延迟并稀释链接权重。始终直接重定向到最终目标。
.htaccess 中 RewriteRule 的顺序重要吗?
非常重要。Apache 从上到下依次处理规则。强制全站 HTTPS 等广泛规则应放在前面,而特定 URL 规则应使用 [L] 标志在匹配后停止规则链。错误的顺序可能导致某些重定向被跳过或产生循环。