Apache mod_rewrite 本身不缓存,但可通过导流至静态缓存页、标准化URL参数、标记动态路由禁用缓存、精简规则结构四步优化性能:首置cache检查规则实现快速命中;用RewriteCond清洗query string提升mod_cache命中率;设环境变量+E=IS_API并配合Header禁用敏感接口缓存;静态资源前置[L]放行,合并条件,删冗余规则。

Apache 的 mod_rewrite 本身不缓存规则,但和缓存模块协同得当,能大幅降低重写开销、减少 PHP 或后端介入次数,从而提升高并发下的响应效率。关键不是让 rewrite 做缓存,而是用 rewrite 把请求“导流”到可被缓存的路径或状态,再由 mod_expires、mod_cache 或文件系统直出完成真正缓存。
把静态缓存页提前拦截,绕过全部重写链
对已生成的 HTML 缓存页(如 cache/about.html),应在所有业务规则前插入检查逻辑,命中即返回,完全跳过后续 rewrite 和 PHP 执行:
- 在
.htaccess或虚拟主机配置中,把以下规则放在最顶部:
RewriteEngine On
# 检查 cache/ 下是否存在对应 .html 文件
RewriteCond %{DOCUMENT_ROOT}/cache/$1.html -f
RewriteRule ^([^/.]+)$ cache/$1.html [L]
</IfModule>
- 该规则只匹配单段路径(如
/about),不干扰/api/或带扩展名的请求; -
[L]确保命中后立即终止,不继续解析下面几十条规则; - 搭配
mod_expires对.html设置强缓存头,浏览器和 CDN 都能复用。
用重写标准化 URL,提升 mod_cache 命中率
mod_cache 默认以完整 URL(含所有 query string)为缓存键,/search?q=foo&utm_source=ad 和 /search?q=foo&v=123 被视为不同资源。可通过 rewrite 提前清洗参数,再交由 CacheKeyBaseURL 控制缓存键:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用必要模块:
mod_rewrite、mod_cache、mod_cache_disk; - 在
<Location "/search">中添加:
RewriteEngine On
# 移除 utm_*、v、ts 等无意义参数,保留 q、page 等业务参数
RewriteCond %{QUERY_STRING} ^(.*)(&)?(utm_[^&]+|v|ts)=[^&]*(.*)$
RewriteRule ^(.*)$ $1?%1%4 [E=CLEAN_QS:%1%4,N]
RewriteCond %{ENV:CLEAN_QS} ^$
RewriteRule ^(.*)$ $1? [E=CLEAN_QS:,N]
</IfModule>
CacheKeyBaseURL "%{REQUEST_URI}?%{ENV:CLEAN_QS}"
- 这样
/search?q=foo&utm_source=mail和/search?q=foo&v=abc都映射到同一缓存键/search?q=foo; - 必须确保后端响应含
Cache-Control: public, max-age=3600,否则 mod_cache 不缓存。
避免 rewrite 触发动态响应被错误缓存
当 rewrite 将 /user/123 映射到 /api.php?id=123,若未显式控制缓存头,CDN 或浏览器可能缓存该响应——导致用户看到他人数据。应主动标记并拦截:
- 在 rewrite 规则中设置环境变量标识动态路由:
- 再配合
mod_headers统一禁用缓存:
Header set Cache-Control "no-store, no-cache, must-revalidate"
</If>
- 比在每个 PHP 脚本里加
header()更可靠,也避免遗漏; - 对登录态、表单提交类接口尤其重要。
精简 rewrite 规则结构,减少运行时开销
高并发下,每多一条 RewriteCond 或没加 [L] 的规则,都会放大 CPU 消耗。优化重点是“快进快出”:
- 静态资源路径(
/css/、/js/、/images/)前置并加[L],直接放行,不参与后续判断; - 合并条件:HTTPS + www 强制跳转不要拆成两个
RewriteCond块,改用单条正则; - 删除测试用、已失效的规则,避免配置膨胀;
- 简单跳转(如
/old.html → /new.html)优先用Redirect指令,不走 rewrite 引擎。


















