apache用mod_proxy实现动静分离的本质是静态资源本地直出、动态请求代理转发;需先用alias声明静态路径(如/static/)并置于proxypass之前,再用proxypass按前缀(如/api)或后缀精准代理动态请求,务必配proxypassreverse防止重定向失败。
apache 用 mod_proxy 实现动静分离,本质是“静态资源本地直出、动态请求代理转发”,不是把所有请求都扔给后端再分发。关键在规则顺序和路径控制——先拦住静态的,剩下的才交给后端。
明确静态资源路径,用 Alias 直接服务
静态文件(如 /static/、/images/、/assets/)不走代理,由 Apache 自己读取返回:
- 用
Alias把 URL 路径映射到服务器本地目录,例如:Alias /static /var/www/myapp/dist/static - 配合
<directory></directory>开放权限,并禁用处理器:<directory><br> Require all granted<br> SetHandler none<br></directory>
- 这样
/static/logo.png就直接从磁盘读取,不经过任何代理或脚本解析
按前缀或后缀精准代理动态请求
动态接口通常有固定路径特征,用 ProxyPass 显式转发:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 按前缀转发(推荐):
ProxyPass /api http://127.0.0.1:8080/apiProxyPassReverse /api http://127.0.0.1:8080/api - 按后缀转发(需
mod_rewrite):RewriteRule \.(php|jsp|do)$ http://127.0.0.1:8080%{REQUEST_URI} [P] - 必须配
ProxyPassReverse:否则后端返回的Location重定向头会暴露内网地址,导致跳转失败
避免动静冲突的三项实操要点
很多问题出在规则覆盖或误解析,不是模块没启好:
- 静态路径要优先声明:把
Alias和ProxyPass写在一起时,Alias必须放在ProxyPass前面,否则会被代理规则抢先匹配 - 根路径慎用通配代理:不要写
ProxyPass / http://backend/然后再试图排除静态路径;应先ProxyPass / !排除所有静态路径,再写具体代理规则 - 检查后缀绑定:确认没用
AddHandler把.js或.css错绑到 PHP 等处理器上,否则静态文件会被执行而非下载
验证与调试小技巧
配置完别急着重启,先做这几步:
- 运行
apache2ctl configtest确保语法正确 - 访问一个图片 URL,用浏览器开发者工具看响应头:
— 如果有X-Sendfile或Content-Length且无X-Powered-By,说明是 Apache 直出
— 如果出现X-Powered-By: Servlet或Server: Apache-Coyote,说明被错误代理到了 Tomcat - 临时加一条日志规则定位路径匹配:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{pid}P" combined_pid<br>CustomLog /var/log/apache2/debug.log combined_pid env=proxy
再用SetEnvIf Request_URI "^/api/" proxy标记代理请求










