Apache 2.4.8+ 引入 END 标志,用于彻底终止当前请求的重写引擎处理,不仅跳过后续规则,还阻止任何二次重写匹配;需配合精确路径和内部 substitution 使用,不可与 R、N 等标志混用。

Apache 2.4 引入了 END 标志,用于彻底终止当前重写流程,比 L(last)更严格——它不仅跳过后续规则,还阻止所有后续的重写引擎处理(包括在同一次请求中可能触发的其他上下文重写,如目录级 .htaccess 或 <directory></directory> 块中的规则重入)。
但需注意:END 并非“强制终止当前重写流程”的通用替代方案,而是一个有明确适用边界的高级标志,且仅在 Apache 2.4.8 及以上版本可用。
END 标志的核心作用
- 阻止当前重写循环中任何后续规则执行(这点与
L相似); -
关键区别:
END还会禁止 Apache 在当前请求生命周期内对同一 URI 再次进入重写引擎(例如,避免因内部子请求、路径规范化或别名处理导致的二次匹配); - 适用于需要绝对确定性终止的场景,比如精确匹配后必须原样交由后续处理器(如 PHP-FPM、静态文件模块),不希望被任何其他重写逻辑干扰。
✅ 正确理解:
END不是“让重写停止”,而是“让重写引擎在此刻彻底退出本次请求的 URL 处理链”。
如何正确使用 END 标志
- 必须出现在
RewriteRule的标志列表中,格式为[END]; - 不能与其他可能引发重写重启的标志共存(如
N、P、R); - 通常配合精确匹配条件(如
^/api/v1/users$)和明确的 substitution 使用; - 若 substitution 是内部路径(如
/index.php),确保该路径能被后续处理器正常响应。
RewriteEngine On RewriteRule ^/legacy/old-page\.html$ /new-page.html [END]
该规则一旦匹配,Apache 将:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不再检查
.htaccess中剩余规则; - 不再尝试将
/new-page.html送入重写引擎二次处理; - 直接交由内容处理器(如
mod_alias或文件模块)查找并返回/new-page.html。
END vs L:什么时候选 END?
| 场景 | 推荐标志 | 原因 |
|---|---|---|
| 简单跳过本规则之后的所有规则,但允许可能的内部重入(如别名展开) | L |
兼容性好,Apache 2.2+ 全支持,足够日常使用 |
需要防止重写被“绕回”(例如某规则重写为 /index.php,而 .htaccess 中恰好又有 RewriteRule ^index\.php$ ...) |
END |
彻底切断重写链,避免意外循环或覆盖 |
| 在虚拟主机或服务器级配置中做最终路由分发(如 API 前端统一入口) | END |
确保路由决策不可被下层配置篡改 |
⚠️ 注意:滥用 END 可能导致预期外的 404(例如重写目标路径未被正确处理),务必验证 substitution 路径是否可达。
常见误用与排查
❌
RewriteRule .* /index.php [END,R]
错误:END和R(重定向)冲突。重定向本身会发起新请求,END对新请求无效,且两者语义矛盾。-
❌ Apache [END]
报错:Invalid command 'END'或规则被忽略。请先确认版本:httpd -v # 或 apache2 -v
❌ 在
.htaccess中过度依赖END替代逻辑控制
建议:优先用RewriteCond+L组合实现条件终止;END应作为兜底保障,而非常规控制流手段。
验证 END 是否生效
可结合 LogLevel rewrite:trace3(Apache 2.4)查看重写日志:
- 出现
strip per-dir prefix: /path → path后紧接applying rule '...'→ 执行END→ 日志显示exit the rewrite engine.
表明已彻底退出。
不复杂但容易忽略:END 的价值不在“多一个选项”,而在提供重写流程的确定性终点。

















