启动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了,就万事大吉了~~
|