Apache中无END标志,但可通过[L]终止当前轮次,再配合环境变量+E+RewriteCond实现全局跳过;用<Location>或<Directory>隔离作用域可杜绝规则继承;[NS]跳过子请求,[PT]确保处理器传递;加!-f和!-d条件避免重写真实资源。

Apache mod_rewrite 高级配置不是堆砌规则,而是精准控制重写生命周期、隔离作用域、避免意外干扰。关键不在“多”,而在“准”和“稳”。
用 [L] + 环境变量守门,实现逻辑上的“END”效果
Apache 没有真正的 END 标志(那是 Nginx 的语法),但可以用 [L] 终止当前轮次,再配合环境变量跳过后续所有规则:
- 在所有通用规则最前面插入拦截规则,比如保护 /api/ 和 /static/:
RewriteCond %{REQUEST_URI} ^/api/[OR]
RewriteCond %{REQUEST_URI} ^/static/
RewriteRule ^ - [E=no_rewrite:1,L]
- 然后在每条后续规则前加守门条件:RewriteCond %{ENV:no_rewrite} !=1
- 这样被标记的请求就完全绕过所有重写逻辑,等效于“一锤定音”
用 <Location> 或 <Directory> 隔离作用域,从结构上杜绝干扰
把特定路径的规则放进独立容器里,不继承外层配置,是最干净的解法:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- <Location "/api/"> 内只放 API 专用规则,RewriteEngine On 后直接写路由,不混入其他逻辑
- <Location "/static/"> 中直接写 RewriteEngine Off,彻底禁用重写,静态资源直出无损耗
- 这类配置应写在 httpd.conf 或 VirtualHost 块内,而非 .htaccess,避免多层叠加引发不可控行为
慎用 [NS] 和 [PT],明确区分子请求与主请求
Apache 会在内部子请求中重新运行重写引擎,容易导致规则被重复触发:
- 加 [NS] 可让规则跳过子请求(如包含 SSI、ErrorDocument 或内部重定向产生的请求)
- 加 [PT](PassThrough)确保重写后的路径交由后续处理器(如 PHP、Alias)继续处理,而不是被当作文件路径直接查找
- 例如:RewriteRule ^/blog/(.*)$ /index.php?route=blog/$1 [QSA,PT,L] —— 缺少 PT 可能导致 404
结合条件判断做真实存在性检查
避免重写真实存在的文件或目录,是防止循环或冲突的基础操作:
- 在主要重写规则前加上两行守门条件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [L]
- 意思是:只有当请求路径不是真实文件(!-f)且不是真实目录(!-d)时,才走前端控制器逻辑
- 这对单页应用(SPA)、WordPress、Laravel 等框架路由必不可少

















