Tomcat 9.0.75 RewriteRule配置失败求助:自定义域名跳转问题
Tomcat 9.0.75 友好域名映射配置方案
一、修复RewriteValve配置实现内部映射
你之前用RewriteValve没成功,核心问题是用了[R=302]外部跳转,而你需要的是内部代理映射(浏览器地址栏保持mydomain2),同时规则路径匹配也需要调整:
1. 确认server.xml的Host配置
如果mydomain2是独立域名,先在server.xml里新增对应的Host节点(如果是复用localhost,直接在原Host下加Valve即可):
<Host name="mydomain2" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> <!-- 可选:如果需要支持www前缀,加别名 --> <Alias>www.mydomain2</Alias> </Host>
如果是用localhost作为Host,确保原Host节点已经包含RewriteValve。
2. 正确编写rewrite.config
在conf/Catalina/mydomain2/目录下创建rewrite.config(如果用localhost,就放conf/Catalina/localhost/),内容改成:
# 匹配mydomain2或www.mydomain2的请求 RewriteCond %{HTTP_HOST} ^mydomain2$ [OR] RewriteCond %{HTTP_HOST} ^www.mydomain2$ # 内部代理到原应用路径,用Tomcat内部相对路径,不要写外部域名 RewriteRule ^/(.*)$ /ords/r/workspace/myapp/$1 [P,L]
[P]:标记为内部代理,请求会在Tomcat内部转发,浏览器地址不变[L]:执行完这条规则后停止后续匹配- 不用写完整的
https://mydomain,因为是内部转发,直接用应用的相对路径即可
3. 验证hosts映射
确保本地hosts文件里已经添加:
127.0.0.1 mydomain2
二、用Context配置实现根路径映射
如果你的ords是已部署的Web应用,也可以通过配置Context直接把mydomain2的根路径绑定到目标子路径:
1. 创建ROOT.xml配置文件
在conf/Catalina/mydomain2/下创建ROOT.xml(文件名必须是ROOT.xml,对应域名的根路径),内容:
<Context docBase="${catalina.base}/webapps/ords" path="" reloadable="true"> <!-- 解决特殊字符解析问题,可选 --> <Parameter name="org.apache.tomcat.util.http.parser.HttpParser.requestTargetAllow" value="|{}" /> <!-- 启用RewriteValve做内部路径跳转 --> <Valve className="org.apache.catalina.valves.rewrite.RewriteValve" /> </Context>
2. 配套rewrite.config
同样在conf/Catalina/mydomain2/下创建rewrite.config:
# 把根路径跳转到目标子路径 RewriteRule ^/$ /ords/r/workspace/myapp/ [L] # 把所有子路径转发到目标路径 RewriteRule ^/(.*)$ /ords/r/workspace/myapp/$1 [L]
三、排查要点
- 查看日志:检查
logs/localhost.log或访问日志,确认请求是否到达Tomcat,以及规则是否匹配 - 权限检查:确保
conf/Catalina/mydomain2/目录存在,Tomcat有权限读写该目录及文件 - HTTPS配置:如果使用HTTPS,server.xml里的SSL Connector要配置正确,且
mydomain2的Host使用相同的SSL端口
内容的提问来源于stack exchange,提问作者Ryu415
相关产品推荐
相关产品推荐

