Apache反向代理Tomcat必须启用mod_proxy和mod_proxy_http模块,取消httpd.conf中对应LoadModule行的注释;ProxyPass路径末尾斜杠影响URL重写逻辑,建议统一使用无尾斜杠写法;须在httpd-vhosts.conf中配置VirtualHost并设ProxyRequests Off、Require all granted及ProxyPassReverse。

Apache反向代理Tomcat必须启用mod_proxy和mod_proxy_http模块
默认XAMPP的httpd.conf中,mod_proxy相关模块大多被注释掉。不显式启用,ProxyPass指令会直接报错:Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration。
打开xampp/apache/conf/httpd.conf,取消以下两行的注释(注意:不是mod_proxy_ajp——那是AJP专用,HTTP代理用不到):
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so
若还需代理HTTPS后端或做跨域调试,可一并启用mod_ssl和SSLProxyEngine on,但纯本地Java Web开发通常不需要。
ProxyPass路径末尾斜杠影响请求转发行为
这是最常踩的坑:路径结尾是否带/,决定了URL重写逻辑。比如:
立即学习“Java免费学习笔记(深入)”;
-
ProxyPass /myapp http://localhost:8080/myapp→ 请求/myapp/index.jsp会被转发为http://localhost:8080/myapp/index.jsp(正确) -
ProxyPass /myapp/ http://localhost:8080/myapp/→ 同样能工作,但多一层路径裁剪,容易在静态资源路径上出错 -
ProxyPass /myapp http://localhost:8080/myapp/→ 会导致/myapp/css/style.css被转发成http://localhost:8080/myapp//css/style.css(双斜杠),Tomcat可能返回404
建议统一使用无尾部斜杠写法,并确保Tomcat中部署的Context Path与之严格匹配(即WAR包名是myapp.war,访问路径就是/myapp)。
必须在httpd-vhosts.conf中配置VirtualHost并禁用ProxyRequests
把ProxyPass直接写在httpd.conf末尾虽能跑通,但违反Apache安全规范,且无法配合ServerName做域名级路由。正确做法是:
编辑xampp/apache/conf/extra/httpd-vhosts.conf,添加完整虚拟主机块:
<VirtualHost *:80>
ServerName localhost
ProxyRequests Off
<Proxy *>
Require all granted
</Proxy>
ProxyPass /myapp http://localhost:8080/myapp
ProxyPassReverse /myapp http://localhost:8080/myapp
</VirtualHost>
注意三点:
-
ProxyRequests Off必须存在,否则Apache会变成开放代理,存在安全风险 -
Require all granted替代旧版Allow from all(XAMPP 1.8.3+基于Apache 2.4,默认拒绝所有) -
ProxyPassReverse不能省——它重写响应头中的Location、Set-Cookie等字段,否则重定向或登录态会失效
Tomcat未启动或端口冲突时,Apache代理会静默失败
现象是:访问http://localhost/myapp返回503 Service Unavailable,但Apache错误日志里只有一行proxy: HTTP: failed to make connection to backend,没提具体原因。
排查顺序应是:
- 先确认
xampp/tomcat/bin/startup.bat已运行,且控制台无SEVERE级别错误(如端口8080被占用、web.xml语法错误) - 手动访问
http://localhost:8080/myapp验证Tomcat本身是否正常 - 检查Windows防火墙或杀毒软件是否拦截了8080端口(尤其某些国产安全软件会静默拦截)
- 若改过Tomcat端口(如改成8090),
ProxyPass里的目标地址必须同步更新
不要跳过直连Tomcat这步——代理只是通道,底层服务不可用时,再完善的代理配置也无意义。


















