END标志作用是让重写引擎彻底终止当前请求的全部后续匹配轮次,其生效需同时满足Apache≥2.3.9、规则位于主配置、不与其他外部动作共存、且未含PT标志四个前提。

END标志的作用不是“停本轮规则”,而是让重写引擎彻底放手——当前请求不会再进入任何后续匹配轮次。它比L更彻底,但使用条件也更严格。
END生效的前提条件
必须同时满足以下四点,END才会真正起作用:
- Apache版本 ≥ 2.3.9,强烈建议用 2.4.17 或更高稳定版(早期 2.4.x 小版本存在边界 bug)
- 规则必须写在主配置中(
httpd.conf或块内),.htaccess 中的 END 大概率被忽略或降级为 L - 不能与
R、F、G、P、PT等外部动作标志共存——END 是纯内部终结 - 若规则中已含
PT,END 将失效,因为控制权已移交其他处理器
为什么 END 比 L 更可靠
L 只跳过本轮剩余规则,但重写后的新 URI(如 /api/foo → /index.php?r=foo)可能再次触发整套规则扫描,造成意料外的二次处理或 404;END 则直接切断整个重写流程,连第二轮都不会启动。
常见误判示例:
- 写了
RewriteRule ^/api/(.*)$ /index.php?r=$1 [L],以为安全,结果/index.php?r=...被后续RewriteCond %{REQUEST_FILENAME} !-f捕获,引发二次重写 - 在 .htaccess 中加了 END,但父目录 httpd.conf 里还有全局规则——END 不起作用,那些规则仍会执行
正确配置示例(主配置中)
假设你希望所有 /api/xxx 请求直通到 index.php,且不允许再被其他规则干预:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On RewriteRule ^/api/(.*)$ /index.php?r=$1 [END]
注意:不要加斜杠前缀写成 ^/api/(在 VirtualHost 中通常应去掉开头的 /,写成 ^api/),否则可能不匹配;路径写法需与上下文一致。
END 不可用时的替代方案
如果你用的是 Apache 2.2、旧版 2.4,或只能在 .htaccess 中操作,可组合以下方式模拟 END 效果:
- 用环境变量拦截:先设标记
RewriteRule ^ - [E=REWRITTEN:1],后续规则加条件RewriteCond %{ENV:REWRITTEN} !=1 - 利用
REDIRECT_STATUS:首次重写后该变量被设为200,可写RewriteCond %{ENV:REDIRECT_STATUS} ^$排除已被处理的请求 - 白名单过滤目标路径:例如
RewriteCond %{REQUEST_URI} !^/(index\.php|assets/|robots\.txt),防止重写后路径再次命中
最稳妥的做法是先运行 httpd -v 确认版本;低于 2.4.17 就别依赖 END;在 .htaccess 里写 END,基本等于没写。









