Tomcat如何根据请求确定使用的Host?具体HTTP头疑问
Tomcat 多Host配置匹配的HTTP头疑问
我的Tomcat在一个<Engine>内配置了两个<Host>条目,配置如下:
<Engine name="Catalina" defaultHost="www.foo.com"> <Host name="www.foo.com" appBase="fooapps"/> <Host name="www.bar.com" appBase="barapps"/> </Engine>
但该配置未生效——所有请求均被路由至默认Host。根据Tomcat文档说明:
Tomcat从HTTP头中提取主机名,查找匹配的Host。若无匹配项,请求将被路由至默认Host。
我想知道Tomcat究竟会查看哪些HTTP头来决定为特定请求使用哪个<Host>?
补充说明
我已解决根本问题:Tomcat前端存在一台我之前不知情的Apache httpd服务器,添加ProxyPreserveHost On配置后,各域名均可正常显示对应页面。但出于好奇,我仍想了解Tomcat用于确定Host的具体HTTP头。
回答
Tomcat匹配<Host>节点的逻辑分两种场景:
原生Tomcat(无反向代理/额外Valve配置)
仅依赖标准HTTPHost请求头:- 对于HTTP/1.1及以上版本的请求,
Host头是协议要求的必填项,Tomcat会提取该头中的域名部分(自动忽略端口号),与<Host>节点的name属性做精确匹配。 - 对于HTTP/1.0的请求,由于协议未强制要求
Host头,Tomcat会直接将请求路由到<Engine>指定的默认Host。
- 对于HTTP/1.1及以上版本的请求,
前端有反向代理(如Apache、Nginx)的场景
如果Tomcat配置了RemoteIpValve(用于处理反向代理转发的请求),它会优先读取**X-Forwarded-Host请求头**(可通过Valve的remoteIpHeader等参数自定义头名称),用该头的值来匹配<Host>节点。
你之前遇到的问题,正是因为Apache默认会把转发请求的Host头替换为Tomcat的本地地址,而ProxyPreserveHost On配置会让Apache保留原始请求的Host头并转发给Tomcat,从而让Tomcat能正确匹配对应的<Host>。
内容的提问来源于stack exchange,提问作者geert3
相关产品推荐
相关产品推荐

