Linux下Apache的301重定向核心依赖mod_rewrite模块,需启用该模块、设置AllowOverride All、在.htaccess中编写精准规则(如强制HTTPS、www规范、整站迁移等),并通过curl或在线工具验证响应头是否含“HTTP/1.1 301 Moved Permanently”。

Linux 下 Apache 的 301 重定向,核心靠 mod_rewrite 模块实现,关键在规则写得准、启用配得对、生效验得清。不改配置文件就写 .htaccess 是最常用也最稳妥的方式,适合绝大多数虚拟主机或独立服务器环境。
确认 mod_rewrite 已启用
先检查 Apache 是否加载了重写模块:
- 打开
/etc/httpd/conf/httpd.conf(CentOS/RHEL)或/etc/apache2/apache2.conf(Ubuntu/Debian) - 确认这行未被注释:
LoadModule rewrite_module modules/mod_rewrite.so - 找到对应站点的
<Directory>区块,把AllowOverride None改为AllowOverride All - 保存后执行
sudo systemctl restart apache2或sudo systemctl restart httpd
用 .htaccess 实现常见跳转场景
把以下代码保存为 .htaccess(注意开头有个点),上传到网站根目录即可生效:
-
HTTP 强制跳 HTTPS:
RewriteEngine On<br>RewriteCond %{HTTPS} off<br>RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] -
www 跳非 www(或反之):
RewriteEngine On<br>RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]<br>RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
(反向只需把条件改成!^example\.com$,目标换成带 www 的地址) -
整站域名迁移:
RewriteEngine On<br>RewriteRule ^(.*)$ https://newdomain.com/$1 [R=301,L]
-
单页面 301 跳转:
RewriteEngine On<br>RewriteRule ^old-page\.html$ /new-page.html [R=301,L]
保留查询参数与路径结构
很多跳转需要把原 URL 的路径和 ? 后面的参数一起带上,否则搜索权重会断档。关键在 %{QUERY_STRING} 和 $1 的配合:
- 例如把
oldsite.com/product?id=123跳到newsite.com/item?id=123:
RewriteEngine On<br>RewriteCond %{HTTP_HOST} ^oldsite\.com$<br>RewriteRule ^product$ https://newsite.com/item?%{QUERY_STRING} [R=301,L] - 如果要匹配任意路径并带参跳转:
RewriteRule ^(.*)$ https://newsite.com/$1?%{QUERY_STRING} [R=301,L]
验证是否真正生效
别只看浏览器跳过去就完事,要确认返回的是 301 状态码:
- 用命令行测试:
curl -I http://old.example.com,看响应头里是否有HTTP/1.1 301 Moved Permanently和正确的Location: - 用在线工具如 站长之家状态码检测 输入原 URL 查看结果
- Chrome 开发者工具 → Network 标签页 → 刷新页面 → 找对应请求,看 Status 列是否显示 301


















