apache中[r=301]标记用于rewriterule末尾,显式返回http 301状态码,告知浏览器和搜索引擎资源已永久迁移;必须启用mod_rewrite模块、配合rewriteengine on使用,并常与[l]联用以终止规则链。
![apache 中 mod_rewrite 怎么使用 [r=301] 标记显式返回永久重定向状态码](https://img.php.cn/upload/article/001/242/473/178743930761007.jpg?x-oss-process=image/resize,p_40)
Apache 中用 [R=301] 标记返回永久重定向,核心是让 RewriteRule 显式发出 HTTP 301 状态码,告诉浏览器和搜索引擎“这个地址已永久搬走”。它必须配合 RewriteEngine On 和正确的规则结构使用,不能单独存在。
必须启用 mod_rewrite 模块
没有这个前提,所有带 [R=301] 的规则都不生效:
- Ubuntu/Debian 系统运行:
sudo a2enmod rewrite,再重启 Apache(sudo systemctl restart apache2) - CentOS/RHEL 系统检查
/etc/httpd/conf/httpd.conf,确认这行未被注释:LoadModule rewrite_module modules/mod_rewrite.so - 若用
.htaccess,还需在对应目录的<directory></directory>块中设AllowOverride All或至少包含FileInfo
基本写法与关键细节
[R=301] 必须写在 RewriteRule 末尾,且通常搭配 [L](Last)一起用,避免后续规则干扰:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 正确示例:
RewriteRule ^old-page\.html$ /new-page.html [R=301,L] - 目标为外部域名时,必须写完整 URL:
RewriteRule ^blog/$ https://new-site.com/articles [R=301,L] - 想保留原始路径和查询参数,用
$1和%{QUERY_STRING}:RewriteRule ^product$ https://new-site.com/item?%{QUERY_STRING} [R=301,L] - 单独写
[R]默认是 302 临时跳转;[R=permanent]等价于[R=301],但数字更直观、更常用
常见组合场景写法
实际使用中,[R=301] 很少孤立出现,常与条件判断和路径捕获配合:
- 强制 HTTPS + 去 www:
RewriteCond %{HTTPS} off [OR]RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]RewriteRule ^(.*)$ https://%1/$1 [R=301,L] - 整站换域名:
RewriteCond %{HTTP_HOST} ^(www\.)?old\.com$ [NC]RewriteRule ^(.*)$ https://new.com/$1 [R=301,L] - 主域名跳子域:
RewriteCond %{HTTP_HOST} ^example\.com$ [NC]RewriteRule ^(.*)$ https://blog.example.com/$1 [R=301,L]
验证是否真正返回 301
浏览器地址栏跳转成功 ≠ 返回了 301。必须查响应头:
- Chrome 开发者工具 → Network → 刷新页面 → 点击跳转前的请求 → 查看 Response Headers 是否含
HTTP/1.1 301 Moved Permanently - 命令行验证:
curl -I http://old.com/some-path,输出第一行应为HTTP/1.1 301 Moved Permanently - 注意:浏览器会强缓存 301,测试务必用无痕窗口或加
-H "Cache-Control: no-cache"










