[L]的作用是当前规则匹配成功后立即停止本轮所有后续RewriteRule的匹配和执行,避免性能浪费、逻辑错乱、参数丢失及无限循环;它仅终止当前轮次重写流程,不中断Apache整体请求处理。
![apache 中 rewriterule 怎么使用 [l] 标记终止后续规则的匹配](https://img.php.cn/upload/article/001/242/473/179125107130788.jpg)
[L] 的作用是:当前规则匹配成功后,立即停止本轮所有后续 RewriteRule 的匹配和执行。它不终止 Apache 整体请求处理,也不影响 RewriteCond 判断本身,只让重写引擎“跳过剩下的规则”,避免误改、覆盖或循环。
为什么必须加 [L]?
Apache 默认按顺序逐条检查每条 RewriteRule,即使前面某条已生效,后续规则仍会继续尝试匹配。这会导致:
- 性能浪费——50 条规则里,80% 请求命中第 1 条,不加 [L] 就白跑剩下 49 次正则
- 逻辑错乱——比如先重写为 /api.php,后一条又把 /api.php 改成 /error.html
- 参数丢失——[QSA] 没被及时应用,或重定向被二次触发变成 302→301→404
- 无限循环——兜底规则 ^(.*)$ 不加 [L],可能反复匹配自己
哪些场景一定要加 [L]
以下规则类型,几乎都应带 [L],否则容易出问题:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 高频路径:如
RewriteRule ^/$ /index.php [L]、RewriteRule ^products$ /catalog.php [L] - 拦截类规则:如
RewriteRule \.php$ - [F,L](禁止直接访问 .php) - 重定向操作:如
RewriteRule ^old/(.*)$ /new/$1 [R=301,L] - 代理转发:如
RewriteRule ^api/.*$ http://backend/api/ [P,L] - 兜底路由:如
RewriteRule ^(.*)$ /index.php [L](务必放最后)
常见错误写法
这些看似合理,实则埋了坑:
- 漏写 [L] 却依赖“条件不满足就跳过整组”——RewriteCond 只控制紧邻的一条 RewriteRule,不会自动跳过后面的规则
- 多条规则共用同一 RewriteCond,但没用 [C] 链接,也没加 [L],结果条件满足后仍执行无关规则
- 在虚拟主机中启用 RewriteEngine On 后,旧规则残留且无 [L],新规则被意外覆盖
- 误以为 [L] 能跳出整个配置块——它只对当前轮次有效;真要跳过全部,需配合环境变量 + RewriteCond
怎么验证 [L] 是否起效
开启重写日志最直观:
- 在 Apache 配置中加入:
LogLevel alert rewrite:trace3 - 重启服务,访问目标 URL
- 查看 error_log:若看到
go to next rule,说明 [L] 没生效;若匹配后直接退出,就是正常行为

















