[心缘地方]同学录
首页 | 功能说明 | 站长通知 | 最近更新 | 编码查看转换 | 代码下载 | 常见问题及讨论 | 《深入解析ASP核心技术》 | 王小鸭自动发工资条VBA版
登录系统:用户名: 密码: 如果要讨论问题,请先注册。

[备忘]tomcat的defaultHost设置错误引起的400 Bad Request错误

上一篇:[备忘]linux下安装加密卡驱动,报错:部分文件无法关联xxx.so
下一篇:[备忘]Flex调用Web Service时,跨域的问题

添加日期:2013/10/15 22:11:05 快速返回   返回列表 阅读13082次
启动tomcat后,正常启动了。

但是,输入本机ip访问没反应,大白页,

tomcat控制台没内容。

使用抓包工具,发现服务端实际返回的是400 Bad Request~~

搜索:
-------------------------------------------------
【Tomcat】400错误
在tomcat 配置文件 server.xml 中有这样的定义 
    <Engine name="Catalina" defaultHost="localhost"> 
    defaultHost="localhost" 这个的作用是当你访问的时候默认给你分配到那个虚拟主机 
    在文件里面还有      
       <Host name="localhost" appBase="webapps" 
       unpackWARs="true" autoDeploy="true" 
       xmlValidation="false" xmlNamespaceAware="false"> 
       </Host> 
这里定义了一个虚拟主机,那么你访问的时候默认就分配到localhost这个虚拟主机。如果去掉defaultHost="localhost" 
你在本地访问http://localhost:8080 可以访问到应为即使没有默认,tomcat 也会用你URL里的 localhost 去对应server.xml定义的localhost主机。但是如果是远程访问的话就不行了,应为http://localhost:8080 这样的形式只有本机可以访问,远程要访问你的话 只能用http://192.168.0.110 这样的形式 
那么tomcat 首先会先找有没有defaultHost=“某个虚拟主机”如果没有默认那么会从下边定义的虚拟主机里面找结果 没有192.168.1.121 这样的主机只有一个localhost主机 就是没有找到对应的虚拟主机,这个时候就会报400错误 
或者你defaultHost指定了,当是下面没有定义对应的主机也会报 400错误。 
----------------------------------------

查看我的Server.xml发现,defaultHost写的是localhost,
但下面host的name写的是外网IP,

仔细查看tomcat启动的log,发现有个警告,unknow 的defaultHost:localhost

汗~~

把defaultHost改成了下面的外网IP,重启,OK了~~
=====================================
一个Host就代表一个虚拟主机,name其实就是绑定的主机头。
如<host name="www.aaa.com" appBase="c:\aaa"
那么访问www.aaa.com/xxx就访问了c:\aaa\xxx对应的web application
那么访问www.aaa.com/yyy就访问了c:\aaa\yyy对应的web application
那么访问www.aaa.com/就访问了c:\aaa\ROOT对应的web application

再加一个host name="www.bbb.com" appBase="c:\bbb"
那么访问www.bbb.com就访问了c:\bbb下的对应的web application
...类似~~

www.aaa.com和www.bbb.com在DNS服务器,都解析到这台机器的IP。
然后这里,根据host name来区分访问哪个虚拟主机。
----------------------------
主机的别名:
<host name="www.aaa.com" appBase="c:\aaa">
    <Alias>aaa.com</Alias>
    <Alias>eeee.ffff.gggg.com</Alias>
</host>
几个域名都对应一个主机
=====================================================
下面是试验的结果:

首先,在host文件里增加一行本机IP和域名的映射:
192.168.12.172 www.n.com

(1)
<Engine name="Catalina" defaultHost="localhost">
    <Host name="www.n.com"  appBase="webapps"...
由于defaultHost="localhost",而该host不存在,所以按访问时的URL中的主机名进行匹配。
使用www.n.com/xxx访问,URL中主机名是www.n.com,所以访问OK
使用192.168.12.172/xxx访问,URL中主机名是192.168.12.172,该名称的host不存在,故返回400 bad request
使用localhost/xxx访问,同上,400 bad request

(2)
<Engine name="Catalina" defaultHost="localhost">
    <Host name="192.168.12.172"  appBase="webapps"...
类似,使用192.168.12.172/xxx访问是OK的,其它返回400.

(3)
<Engine name="Catalina" defaultHost="www.n.com">
    <Host name="www.n.com"  appBase="webapps"...
则3种方式都OK,匹配不上的主机名,一律按访问defaultHost处理

(4)
<Engine name="Catalina" defaultHost="192.168.12.172">
    <Host name="192.168.12.172"  appBase="webapps"...
一样,全都OK。

(5)
<Engine name="Catalina" defaultHost="www.xxxx.com">
    <Host name="www.xxxx.com"  appBase="webapps"...
虽然www.xxxx.com是乱写的,但一样,全都OK。

所以,只要defaultHost写OK了,就万事大吉了~~
 

评论 COMMENTS
没有评论 No Comments.

添加评论 Add new comment.
昵称 Name:
评论内容 Comment:
验证码(不区分大小写)
Validation Code:
(not case sensitive)
看不清?点这里换一张!(Change it here!)
 
评论由管理员查看后才能显示。the comment will be showed after it is checked by admin.
CopyRight © 心缘地方 2005-2999. All Rights Reserved