apache rewriterule本身不代理请求,但通过“先重写、再代理”为mod_proxy提供精准路径预处理:统一动态接口前缀(如重写/login为/api/login)、结合rewritecond+[p]实现灰度分流、用proxypass !显式排除静态路径,并配合proxypassreverse等确保host与cookie正确。

Apache 的 RewriteRule 本身不代理请求,但它能为后端代理(如 mod_proxy)提供精准的路径预处理——关键在于“先重写、再代理”,让动态路径在进入 ProxyPass 前就变成可匹配的静态结构,整个过程对客户端完全透明。
用 RewriteRule 统一动态接口前缀,再交给 ProxyPass
当后端服务没有统一路径规范(比如有的 API 是 /login,有的是 /v2/order),直接配 ProxyPass 容易漏匹配或冲突。先用 RewriteRule 把所有动态入口收口到一个标准前缀下:
-
RewriteRule ^/(login|order|profile|logout)$ /api/$1 [L]—— 把根级接口重写为/api/xxx -
RewriteRule ^/v([0-9]+)/(.*)$ /api/v$1/$2 [L]—— 把版本路径转成带前缀的结构 - 之后只需一条
ProxyPass /api/ http://localhost:8080/就能覆盖全部
按请求特征做条件代理,实现灰度或环境分流
单纯靠路径不够时,RewriteCond 可读取请求头、Cookie 或参数,配合 [P] 标志触发不同代理目标:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
RewriteCond %{HTTP:X-Env} ^staging$→RewriteRule ^/api/(.*)$ http://staging-backend/$1 [P,L] -
RewriteCond %{HTTP_COOKIE} version=beta→RewriteRule ^/dashboard$ http://beta-dashboard/ [P,L] - 注意:[P] 不可省略,否则只是 URL 重写,不会真正发起到后端的请求
避免静态资源被误代理,保证动静分离有效
动态路径转发的前提是静态资源必须“绕过代理、直出文件”。RewriteRule 可辅助拦截,但更推荐用 ProxyPass ! 显式排除:
- 把
ProxyPass /static/ !放在所有 ProxyPass 规则之前(顺序敏感) - 若需对静态路径加版本控制(如
/static/v2.5.1/app.js),可用 RewriteRule 内部映射:RewriteRule ^/static/v[0-9.]+/(.*)$ /static/$1 [L] - 这样既保持 URL 干净,又确保 Apache 直接读磁盘,不走后端
转发后 Host 和 Cookie 的兼容处理
代理过去后,后端可能依赖正确的 Host 头或 Set-Cookie 域名,否则会 400 或登录失效:
- 显式设置 Host:
RequestHeader set Host "backend.example.com" - 修正响应中的 Cookie 域名:
ProxyPassReverseCookieDomain backend.example.com proxy.example.com - HTTPS 后端需开启:
SSLProxyEngine On,生产环境务必配可信证书










