先来聊聊为何会有这一么一回事。
在默认的部署下,可以直接通过DNS解析到部署的生产环境下,然后你的域名就能直接访问你的应用了,然后问题来了。你发现你使用域名或是直接IP均能访问到你的应用,这会产生一些安全问题吗?
结果是:会的。
从三个角度来浅析下,其一会引发恶意解析情况,也就是其它人也可以将他的域名解析到你的服务器上,这样以后那也就变成了他的“应用”,会引发很多意想不到的问题;其二若业务逻辑中对域名有相关的安全控制,而通过IP的方式会成为绕过限制的“漏网之鱼”;其三若是需要进行安全评测的应用,相关的安全扫描工具或平台就会报诸如IP地址泄露等,这会增加解释的成本。
好了,说了那么多,怎么在tomcat下处理好该问题是关键。这里拿IP地址是 192.168.1.2 ,相应域名是 www.test.com举例。
打开 %TOMCAT_HOME%/conf/server.xml文件,找到 Engine节点作如下:
<Engine name="Catalina" defaultHost="www.test.com"> <Host name="www.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/> <Host name="192.168.1.2" appBase="ipapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/> </Engine> <Engine name="Catalina" defaultHost="www.test.com"> <Host name="www.test.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/> <Host name="192.168.1.2" appBase="ipapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"/> </Engine>
相关的点是:
1. Engine 节点配置的 defaultHost 表明缺省访问的Host。defaultHost对应的名称必须存在于Engine节点下配置的host节点中。
当一台机器有多个IP,而按照规定只允许通过一个指定的域名访问时很有用。此时,把defaultHost指定为非域名对应的host,这样不通过域名访问时就都定位到指定的非域名HOST了。
2. Host 节点 name 对应IP地址,以及域名。一个Host只有指定一个IP或域名。
3. Host 节点的 appBase ,对应的是存放web应用的目录。这里输入的目录相对于 %TOMCAT_HOME%,如上面的www.test.com对应的目录是 %TOMCAT_HOME%/webapps,而192.168.1.2 对应的目录是 %TOMCAT_HOME%/ipapps。
4.如果想通过IP访问是给用于一个提示,比如:“您好!不允许通过IP直接访问本网站,请通过域名www.test.com访问”
此时可以在%TOMCAT_HOME%/ipapps目录下创建一个名为 ROOT web工程(可以从 webapps目录下拷贝),同时将里面的 index.html文件修改成想要展示给用于的界面。
5.修改localhost为"www.test.com"后,在%TOMCAT_HOME%/conf/Catalina/localhost下test.xml 中配置的虚拟目录会失效。因为配置虚拟目录的元素节点Context 是server.xml下Host 节点下的子节点,Catalina下的文件夹名字是根据host节点的name属性来的。现在Host 的name已经改www.test.com 那么需要在%TOMCAT_HOME%/conf/Catalina 新建一个"www.test.com"的文件夹,然后把localhost下的test.xml 文件拷贝到www.test.com 文件夹下才能是虚拟目录继续有效。