[r] 用于触发外部重定向,使浏览器地址栏变化并返回 http 状态码(默认302);必须用于url变更、seo迁移、协议/域名标准化及非法请求引导等场景,常与[l]组合使用,区别于内部重写。
![apache rewriterule 标志位 [r] 怎么用](https://img.php.cn/upload/article/001/242/473/178735693939241.jpg?x-oss-process=image/resize,p_40)
[R] 是 RewriteRule 中最关键的标志之一,作用是触发外部重定向(HTTP 跳转),让浏览器地址栏发生变化,并向客户端返回一个 HTTP 状态码(默认 302)。它和内部重写(无 [R])有本质区别:一个是“告诉浏览器换地址”,一个是“服务器悄悄换处理脚本”。
什么时候必须用 [R]
- 你想让用户看到的 URL 和实际访问的路径不一致(比如旧链接迁移到新位置)
- 需要搜索引擎更新索引(如 SEO 迁移、页面合并)
- 强制协议或域名标准化(如
http → https、www → non-www) - 处理非法请求并引导到安全页(如屏蔽恶意路径后跳转)
✅ 正确理解:
[R]不是“重写”,而是“发一个跳转响应给浏览器”。后续规则是否执行,取决于是否加了[L]。
Apache 2.4.62下载Apache 2.4.62 官方 tar.gz 源码包是 Linux 及类 Unix 系统构建 Web 服务器的核心基础。通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
[R] 的常见写法与含义
[R]
等价于[R=302],临时跳转,浏览器会缓存但搜索引擎不更新索引。适合调试。[R=301]
永久跳转,搜索引擎会把权重转移到新 URL,用户浏览器也可能缓存。上线前确认无误再用。[R=307]或[R=308]
适用于需保留原始请求方法(如 POST)的场景,比如表单提交重定向。[R=301,L]
最常用组合:永久跳转 + 停止后续规则执行,避免被下一条规则二次处理。
实际例子说明
# 强制 HTTPS(跳转,不是内部转发)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# 统一去掉 www(注意顺序:先匹配带 www 的,再跳转)
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
# 旧文章路径迁移
RewriteRule ^old-article/([0-9]+)\.html$ /news/$1 [R=301,L]
⚠️ 注意:
-
RewriteRule的目标(Substitution)必须是完整可访问的 URL 路径或绝对 URL;若写成/news/$1,Apache 会自动补全为http://domain/news/$1。 - 如果目标里含查询参数(如
?ref=abc),建议加[QSA],否则会被丢弃。 - 不加
[L]可能导致跳转后又被其他规则再次匹配,引发循环或意外行为。
常见误区
- 把
[R]和内部重写混用:比如RewriteRule ^api/(\w+)$ /api.php?action=$1 [R,L]—— 这会让浏览器跳到/api.php?action=xxx,暴露真实脚本路径,通常不该这么做。 - 忘记
RewriteCond配合:直接RewriteRule ^foo$ /bar [R]会无条件跳转,容易误伤正常请求。 - 调试时用了
[R=301]导致浏览器缓存,改完规则没反应 → 改成[R=302]测试,确认没问题再切回 301。
如何验证是否生效
- 打开浏览器开发者工具 → Network 标签 → 访问原 URL,看是否出现 301 或 302 响应头,Location 字段是否正确。
- 地址栏是否变化?变化了就是
[R]生效;没变可能是漏写了[R],或者规则根本没匹配上。 - 查看 Apache
error_log,搜索rewrite相关 trace(Apache 2.4 用LogLevel alert rewrite:trace3)。
不复杂但容易忽略。











