apache动静分离核心是优先用proxypass !显式排除静态路径(如/static/、/uploads/、/images/),再配置动态代理;必须将排除规则置于所有proxypass指令之前,且应按路径而非文件后缀匹配,配合proxypreservehost off和静态节点缓存优化。

Apache 中用 ProxyPass 做动静分离,核心不是“代理静态资源”,而是“不代理、先排除、再转发”——静态路径必须显式豁免,否则全被代理到后端,图片就 404 了。
静态路径必须优先排除(ProxyPass !)
如果你全局代理了动态请求(比如 ProxyPass / http://localhost:8080/),所有请求默认都会发给后端。这时必须在它之前,用 ProxyPass ! 明确告诉 Apache:这些路径别动,我自己处理。
<location> ProxyPass ! </location><location> ProxyPass ! </location><location> ProxyPass ! </location>
顺序不能错:这些 ProxyPass ! 规则必须写在所有 ProxyPass 指令之前,否则无效。
按路径代理比按后缀更可靠
别用 ProxyPassMatch ^/.*\.(jpg|png|gif)$ 这类正则匹配静态资源——语义不清,容易误伤(如 /api/avatar.jpg 是动态接口,但会被当成静态拦截)。
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 推荐方式:约定好静态资源统一走
/static/或/uploads/路径 - 对应配置:
ProxyPass /static/ http://static-server/static/ - 上传类资源建议单独路径:
ProxyPass /uploads/ http://static-server/uploads/
这样既清晰又安全,前端引用也容易统一管理。
静态目标节点要精简+缓存就绪
被 ProxyPass 指向的静态服务器,不能和应用服务器共用一套配置。
- 禁用
mod_php、mod_rewrite等动态模块 - 只启用
mod_headers、mod_expires、mod_deflate - 加强缓存:
ExpiresByType image/jpeg "access plus 1 year" - 对带哈希名的文件(如
app.a2b3c4.js)设immutable:Header set Cache-Control "public, max-age=31536000, immutable"
配合 Host 头与缓存策略防干扰
代理到静态服务时,Host 头若透传过去,可能让静态服务器误判虚拟主机,返回错误响应。
- 务必加上:
ProxyPreserveHost Off - 如果静态节点支持本地缓存,可启用
mod_cache做二级缓存(非必需,CDN 层更关键) - 上传类资源(如用户头像)建议短缓存:
Cache-Control: public, max-age=86400, must-revalidate,并开启ETag









