无需Apache HTTPD,Tomcat嵌套Web应用路径配置问询
Tomcat 8 实现同一域名下应用路径映射(隐藏子应用名称)
嘿,你的需求完全可以在Tomcat 8里实现,根本不用额外搭Apache HTTPD或者改应用代码——Tomcat本身就支持这种内部路径映射的配置,你之前看虚拟主机文档方向偏了(虚拟主机是用来处理多域名场景的),换个思路就搞定了。我给你两种实用的方案,你可以选适合自己的:
方案一:通过上下文配置直接映射路径(无需重命名WAR包)
这种方式最直接,不需要依赖额外组件,纯Tomcat上下文配置就能实现:
- 保持
AppA.war在webapps目录,让Tomcat正常部署成/AppA上下文。 - 把
AppB.war移到Tomcat的webapps目录之外的位置(比如tomcat/custom_apps/AppB,可以是WAR包也可以是解压后的文件夹),避免Tomcat自动将它部署成/AppB。 - 在
tomcat/conf/Catalina/localhost目录下创建一个名为AppA#service.xml的上下文配置文件,内容如下:
<Context docBase="/绝对路径/tomcat/custom_apps/AppB" path="/AppA/service" reloadable="true" />
docBase:填写你存放AppB的绝对路径(如果用相对路径,需相对于Tomcat的CATALINA_BASE目录)path:就是你希望对外暴露的路径,对应https://host.com/AppA/service
重启Tomcat后,用户访问/AppA/service就会直接指向AppB的应用,完全看不到AppB这个名称。
方案二:重命名WAR包+Rewrite Valve转发(灵活支持复杂路径规则)
如果你愿意把AppB重命名为service.war,可以用Tomcat的Rewrite Valve实现更灵活的路径转发:
- 把
AppB.war重命名为service.war,放到webapps目录,Tomcat会自动部署成/service上下文。 - 打开
tomcat/conf/server.xml,找到你的<Host>节点,添加Rewrite Valve配置:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 保留原有的Host配置,比如AccessLogValve等 --> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Host>
- 在
tomcat/conf/Catalina/localhost目录下创建rewrite.config文件,添加转发规则:
# 把/AppA/service开头的请求内部转发到/service RewriteRule ^/AppA/service/(.*)$ /service/$1 [L,PT]
[L]表示这是最后一条规则,匹配后不再继续处理[PT]表示将规则处理后的路径传递给Tomcat的后续处理流程(内部转发,浏览器地址栏不会变化)
重启Tomcat后,用户访问https://host.com/AppA/service/xxx时,请求会被Tomcat内部转发到/service/xxx,浏览器地址栏完全不变,完美隐藏子应用的真实路径。
补充说明
你之前尝试的虚拟主机配置确实不对,因为虚拟主机是用来处理不同域名(比如appA.com和appB.com)的隔离部署,而你需要的是同一域名下的路径映射,所以用上下文配置或者Rewrite Valve才是正确方向。
两种方案都不需要修改任何应用代码,完全在Tomcat层面完成配置,符合你让开发者专注业务编码的需求。
内容的提问来源于stack exchange,提问作者SiLeNCeD
相关产品推荐
相关产品推荐

