mod_rewrite 通过 E=VAR:VAL 设置环境变量,再用 RequestHeader set 将其注入 HTTP 请求头(如 X-User-ID),最后经 ProxyPass 转发至 Java 后端,Java 通过 request.getHeader("X-User-ID") 获取该值。

Apache 的 mod_rewrite 本身不直接向后端 Java 应用(如 Tomcat、Jetty)“传递变量”,它不能把值塞进 HTTP 请求体或 Servlet 的 request.setAttribute()。但可以通过 E=VAR:VAL 标志设置环境变量,再配合 ProxyPass 或 SetEnvIf + RequestHeader 等机制,把变量注入到转发给后端的 HTTP 请求头中——这是 Java 应用实际能读取并使用的标准方式。
用 E 标志设置环境变量
E=VAR:VAL 是 RewriteRule 或 RewriteCond 的标志之一,用于在当前请求上下文中定义一个 Apache 环境变量。注意:它只在 Apache 内部生效,不会自动出现在发往后端的请求里。
- 环境变量名不区分大小写,但建议全大写(如
MY_USER_ID) - 值支持反向引用,例如:
RewriteRule ^/user/(\d+) /api/profile [E=USER_ID:$1] - 多个变量可叠加使用:
[E=USER_ID:$1,E=SOURCE:rewrite]
把环境变量转为 HTTP 请求头
Java 应用只能通过标准 HTTP 头(如 X-User-ID)接收数据。需用 RequestHeader 指令将 Apache 环境变量映射为请求头:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 确保启用了
mod_headers:a2enmod headers - 在相同作用域(
.htaccess、<Directory>或虚拟主机)中添加:RequestHeader set X-User-ID %{USER_ID}e env=USER_ID -
%{VAR}e表示读取环境变量VAR;env=VAR表示仅当该变量存在时才设置头 - 这样,后端 Java 代码就能用
request.getHeader("X-User-ID")获取值
配合反向代理转发给 Java 后端
如果后端是 Tomcat,通常走 mod_proxy 转发。关键点是:环境变量和请求头必须在 ProxyPass 前设置完成。
立即学习“Java免费学习笔记(深入)”;
- 顺序很重要:先
RewriteRule ... [E=...],再RequestHeader set ...,最后ProxyPass - 示例配置片段:
RewriteRule ^/profile/(\d+)$ /api/user/$1 [E=UID:$1,L]<br>RequestHeader set X-UID %{UID}e env=UID<br>ProxyPass /api/ http://localhost:8080/app/ - 此时 Java 接收的请求会带
X-UID: 123头,且路径已重写为/app/user/123
Java 端读取与注意事项
后端无需额外依赖,标准 Servlet API 即可处理:
- 在 Controller 或 Filter 中调用
request.getHeader("X-UID") - 注意头名大小写:HTTP 头名不区分大小写,但 Java 中推荐用原始注册名(如
X-UID) - 避免敏感信息明文传递;如需认证上下文,建议用 token 或 session 关联,而非透传原始 ID
- 若用 Spring Boot,也可通过
@RequestHeader注解直接注入:@RequestHeader("X-UID") String uid

















