Jetty 设置访问IP和虚拟域名(Virtual Hosts)
Jetty 域名介绍
一个IP地址,多个域名可以解析到一个共享服务器实例相同的IP。如果内容的别名名称不同,那么虚拟主机需要分别配置每个部署上下文表示名称上下文将回应。本文介绍配置Jetty域名。
配置
有两个地方可以配置
- WEB-INF/jetty-web.xml
- 配置在webapps的xml
myapp.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd"> <Configure id="testWebapp" class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/example</Set> <Set name="war"><Property name="jetty.webapps" default="."/>/myapp.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>127.0.0.1</Item> <Item>localhost</Item> </Array> </Set> </Configure>
解释
我们看最直接的配置,其他的都不要了
解释一下
名字 | 类型 | 备注 |
---|---|---|
contextPath
|
string | 项目访问路径 |
war
|
string | war包路径 |
virtualHosts
|
array | ip、域名配置,也就是说配了这些才能访问 |
OK,也就是说上面的Virtual Hosts
的配置,除了127.0.0.1
和
localhost
,
其他都不能访问,哪怕你本机地址
Jetty 虚拟主机域名介绍
虚拟主机是注册在DNS中的IP地址的替代名。
虚拟主机有两种形式:
- 多个名称可以解析到一个IP地址。
- 多宿主主机,即具有多个网络接口的机器,每个IP地址可以有不同的名称。
Jetty使用者在配置web应用程序时,经常要考虑到不同虚拟主机的情况。
通常情况下,单个IP地址的机器有不同的DNS解析名称与它相关联(端口号或war包路径不同),在其上部署的webapp必须能够通过所有的解析名称访问到。另一种可能性是从不同的虚拟主机访问不同的web应用程序。让我们来看看这些可能性。
你可以通过几种不同的方式设置虚拟主机,包括:
- 使用context目录中的context XML文件:setVirtualHosts ,这是首选方法。
- 内嵌Jetty用法中的一个Java调用:内嵌Jetty 。
- jetty.xml 中列出的明确部署的web应用(不通过deployer),或类似的机制。
- 使用WEB-INF/jetty-web.xml文件(已过时,但是可以和webapp deployer一起使用,如果你不使用context deployer)。
有关配置Jetty的各种方法的说明,请参阅如何配置Jetty ,其中包括了详细配置文档的链接。
接下来的示例使用首选方式设置虚拟主机,通过调用方法ContextHandler.setVirtualHost setVirtualHosts 。
配置虚拟主机
当配置web应用程序时,你可以设置一个IP地址和名称列表,只有通过列表中的地址才能访问到应用程序。
假设我们有一台机器具有如下IP地址和DNS域名:
- 333.444.555.666
- 127.0.0.1
- www.blah.com
- www.blah.net
- www.blah.org
假设我们有一个web应用程序xxx.war,我们希望通过所有上述的名称和地址都能访问到这个应用。然后,我们将这样配置web应用:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/xxx</Set> <Set name="war"><SystemProperty name="jetty.home"/>/webapps/xxx.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>333.444.555.666</Item> <Item>127.0.0.1</Item> <Item>www.blah.com</Item> <Item>www.blah.net</Item> <Item>www.blah.org</Item> </Array> </Set> </Configure>
假设我们已经配置了一个连接器,监听8080端口,那么web应用“xxx.war”将可以通过以下地址访问:
- http://333.444.555.666:8080/xxx
- http://127.0.0.1:8080/xxx
- http://www.blah.com:8080/xxx
- http://www.blah.net:8080/xxx
- http://www.blah.org:8080/xxx
为不同的虚拟主机配置不同的web应用
简单的为每个web应用提供不同的虚拟主机列表。例如:假设我们虚拟的主机有这些DNS域名和IP地址:
- 333.444.555.666
- 127.0.0.1
- www.blah.com
- www.blah.net
- www.blah.org
- 777.888.888.111
- www.other.com
- www.other.net
- www.other.org
假设我们有另外一个web应用“zzz.war”。我们希望xxx.war如上部署,zzz.war只部署在777.888.888.111、www.other.com、www.other.net和www.other.org中:
<!-- webapp xxx.war --> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/xxx</Set> <Set name="war"><SystemProperty name="jetty.home"/>/webapps/xxx.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>333.444.555.666</Item> <Item>127.0.0.1</Item> <Item>www.blah.com</Item> <Item>www.blah.net</Item> <Item>www.blah.org</Item> </Array> </Set> </Configure> <!-- webapp zzz.war --> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/zzz</Set> <Set name="war"><SystemProperty name="jetty.home"/>/webapps/zzz.war</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>777.888.888.111</Item> <Item>www.other.com</Item> <Item>www.other.net</Item> <Item>www.other.org</Item> </Array> </Set> </Configure>
web应用xxx.war在下列地址仍然可用:
- http://333.444.555.666:8080/xxx
- http://127.0.0.1:8080/xxx
- http://www.blah.com:8080/xxx
- http://www.blah.net:8080/xxx
- http://www.blah.org:8080/xxx
但现在web应用zzz.war在下列地址可用:
- http://777.888.888.111:8080/zzz
- http://www.other.com:8080/zzz
- http://www.other.net:8080/zzz
- http://www.other.org:8080/zzz
为不同的虚拟主机配置不同的web应用,但是具有相同的上下文(context path)
在上面的例子中,我们使得web应用zzz.war在一个特定虚拟主机集合中可用,并且上下文是/zzz。我们其他的web应用在不同的虚拟主机集合中,不同的上下文路径中可用。如果我们希望web应用在同一上下文路径,但是不同的虚拟主机集合中可用,会发生什么呢?
很简单,我们只需为每个web应用提供相同的上下文路径,保留之前定义的不相交的虚拟主机集合:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="war"><SystemProperty name="jetty.home"/>/webapps/xxx.war</Set> <Set name="contextPath">/</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>333.444.555.666</Item> <Item>127.0.0.1</Item> <Item>www.blah.com</Item> <Item>www.blah.net</Item> <Item>www.blah.org</Item> </Array> </Set> </Configure> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="war"><SystemProperty name="jetty.home"/>/webapps/zzz.war</Set> <Set name="contextPath">/</Set> <Set name="virtualHosts"> <Array type="java.lang.String"> <Item>777.888.888.111</Item> <Item>www.other.com</Item> <Item>www.other.net</Item> <Item>www.other.org</Item> </Array> </Set> </Configure>
现在,web应用xxx.war通过下面地址访问:
- http://333.444.555.666:8080/
- http://127.0.0.1:8080/
- http://www.blah.com:8080/
- http://www.blah.net:8080/
- http://www.blah.org:8080/
web应用zzz.war通过下面地址访问:
- http://777.888.888.111:8080/
- http://www.other.com:8080/
- http://www.other.net:8080/
- http://www.other.org:8080/
配置非ASCII字符的虚拟主机
国际域名 是含有非ASCII字符的名称。例如:http://www.bücher.com。DNS内部仍然是基于ASCII的,所以这些类型的名称需要编码处理后存储为ASCII格式,编码规则叫punycode 。现代浏览器将检测URL中的这些非ASCII字符,并自动使用Punycode码编码。例如,键入这个网址到浏览器:
http://www.åäö.com:8080/test/
被翻译成以下的URL:
http://www.xn--4cab6c.com:8080/test/
对于在jetty虚拟主机中使用国际域名的情况,你需要在你的context xml文件中配置punycoded形式的名称(当然,你需要在DNS中提供punycoded形式的域名)。
下面是一个例子。意思是,我在8080端口运行了一个上下文为/test的web应用,我要配置的虚拟主机为www.åäö.com。我在context xml文件中配置了域名的ASCII等效格式:
<Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/</Set> <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/test.war</Set> <Set name="virtualHosts"> <Array type="String"> <Item>www.xn--4cab6c.com</Item> </Array> </Set> </Configure>
在启动Jetty后,我将能够在我的浏览器中输入http://www.åäö.com:8080/test/形式的url来访问我的web应用。
请注意,如果我没有部署任何“/”上下文的web应用,访问http://www.åäö.com:8080的请求将由Jetty默认处理器处理,这会返回一个404页面并列出可用的上下文:
<H2>Error 404 - Not Found.</H2> No context on this server matched or handled this request.<BR> Contexts known to this server are: <ul><li><a href="http://www.xn--4cab6c.com:8080/test">/test @ www.xn--4cab6c.com:8080 ---> WebAppContext@82d210@82d210/test,file:/tmp/Jetty_0_0_0_0_8080_test.war__test_www.xn..4cab6c.com_1jadjg/webapp/,/home/janb/src/jetty-eclipse/jetty/trunk/jetty-distribution/target/distribution/webapps/test.war</a></li> </ul>
你会发现该链接已经有了punycode编码的域名了。
参考推荐:
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2017-10-13 04:48:43
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!