基于名称的虚拟主机和基于IP的虚拟主机的对比

基于IP的虚拟主机使用连接的IP地址来识别(区分)正确的虚拟主机,所以对于每一个虚拟主机,你都需要有独立的IP地址。

基于名称的虚拟主机,服务器依赖于客户端报告的HTTP headers中的hostname。基于这个技术,许多不同的主机可以共享同一个IP地址。

基于名称的虚拟主机通常来说更简单,因为你只需要配置你的DNS服务,让每一个hostname和正确的IP地址相匹配,然后配置Apache去识别不同的hostname。基于名称的虚拟主机也有助于缓解IP地址越来越少的局面。除非你正在使用的设备明确要求基于IP的虚拟主机,你都应该使用基于名称的虚拟主机。历史原因使得基于客户端支持的基于IP的虚拟主机不再适用于多功能的web服务器。

Apache如何选择正确的基于名称的虚拟主机?

必须承认,基于名称的虚拟主机解析的第一步就是基于IP的解析。在筛选了最好的基于IP的候选匹配之后,基于名称的虚拟主机的解析只选择最合适的基于名称的虚拟主机。在虚拟主机指令里对IP地址使用通配符(*)使得基于IP的映射变得无关紧要(<VirtualHost *:80>)。

当一个请求到达时,服务器在请求的IP地址和端口号的基础上,会找出最好的(大多数特征)匹配<VirtualHost>参数。如果有不止一个虚拟主机包含最匹配的地址和端口号组合,Apache将会进而比较ServerName、ServerAlias指令和请求中的server name。

对于基于名称的虚拟主机,如果你忽略了ServerName指令,服务器将会根据系统的hostname为ServerName生成一个“完全限定域名(FQDN)”作为默认值。这种隐藏式地设置ServerName可能导致与正常预期相反的虚拟主机匹配,不推荐这样做。

如果在设置的虚拟主机的集合中没有找到相匹配的ServerName或者ServerAlias,那么将会使用集合中的第一个虚拟主机。

使用基于名称的虚拟主机

第一步是为每一个不同的host创建一个<VirtualHost>块。在每一个<VirtualHost>块中,至少需要一个ServerName指令来标明服务于哪一个主机和一个DocumentRoot指令指定内容在文件系统的位置。

Main host将不再起作用

如果一个请求不匹配任何现有的<VirtualHost>,那么这个请求将会被全局服务器配置处理,并且将不再考虑hostname和ServerName。

当你在向一个服务器添加一个基于名称的虚拟主机时,并且这个虚拟主机参数匹配已存在的IP和端口号组合,那么请求将被唯一的虚拟主机处理。在这种情况下,创建一个ServerName匹配base server的default virtual host通常来说是明智的选择。在相同的接口和端口上的新域名,但是请求对立的配置,可以被添加为子(subsequent)虚拟主机(non-default)。

ServerName继承性

最好总是在每一个基于名称的虚拟主机中明确地列出ServerName。

如果一个虚拟主机没有指定ServerName,那么ServerName将会继承base server 的配置。如果没有指定全局server name,那么将会使用启动时第一个监听的地址反向DNS解析所得的IP地址。其他情况下,继承ServerName将会影响基于名称的虚拟主机解析,所以最好是在每一个基于名称的虚拟主机中总是指定ServerName。

例如:假设你的域名是www.example.com,并且你希望添加虚拟主机other.example.com并指向相同的IP地址。你可以简单地在http.conf添加如下代码:

<VirtualHost *:>
  # This first-listed virtual host is also the default for *:
  ServerName www.example.com
  ServerAlias example.com
  DocumentRoot "/www/domain"
</VirtualHost>
<VirtualHost *:>
  ServerName other.example.com
  DocumentRoot "/www/otherdomain"
</VirtualHost>

你可以使用显示的IP来代替<VirtualHost>中的*。

许多服务器都有处理多个名称需求,通过在<VirtualHost>节中设置ServerAlias可以实现。例如:

<VirtualHost *:>
  # This first-listed virtual host is also the default for *:
  ServerName www.example.com
  ServerAlias example.com *.example.com
  DocumentRoot "/www/domain"
</VirtualHost>

这样,所有请求example.com域名的请求都将会被www.example.com虚拟主机处理。通配符*和?可以用来匹配名称。当然,这些都基于你的DNS服务能正确地将名称、IP地址和你的服务器相关联。

基于名称的虚拟主机对于最匹配的<VirtualHost>是按照它们在配置文件中的位置来排序的。第一个匹配ServerName或者ServerAlias将会被使用,通配符、ServerName、ServerAlias之间没有优先级之分。

在VirtualHost指令中的完整的名称,相当于一个没有通配符的ServerAlias。

最后,你可以在<VirtualHost>节中添加其他的指令来调整虚拟主机的配置。大多数指令都可以放置在这里,并且会且仅会改变相关的虚拟主机的配置。要想知道一个特定的指令是否被允许,可以参考:http://httpd.apache.org/docs/2.4/mod/directive-dict.html#Context。<VirtualHost>之外的配置指令仅在没有被当前虚拟主机配置重写(overridden)的情况下才会生效。

如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。

作  者:blog.jpdou.top

原文链接:http://blog.jpdou.top/apache-name-based-vhost/

最新文章

  1. Local gulp not found in.. on windows
  2. C++小项目:directx11图形程序(二):systemclass
  3. Perforce P4V,添加映射
  4. js中页面刷新和页面跳转的方法总结
  5. mac jdk 6设置
  6. Bzoj4300 绝世好题
  7. hdu 4038 2011成都赛区网络赛H 贪心 ***
  8. android 数据存储----文件方式 总结
  9. udt nat traverse
  10. 教你50招提升ASP.NET性能(十七):不要认为问题只会从业务层产生
  11. HibernateTemplate常用方法总结
  12. poj2538---字符匹配(映射)
  13. Windows 8 动手实验系列教程 实验8:Windows应用商店API
  14. 新建web project不自动生成web.xml解决方案
  15. 使用过滤器(Filter)解决请求参数中文乱码问题(复杂方式)
  16. Java条件查询涉及到时分秒
  17. app ionic1 微信 微博 分享功能的实现
  18. js中this的绑定规则及优先级
  19. jQuery 方式模拟提交表单
  20. php添加购物车

热门文章

  1. Floyd(稠密图,记录路径)
  2. SQL SERVER 判断是否存在数据库、表、列、视图
  3. 实现PIX需要参考的标准资料
  4. Python创建删除文件
  5. POJ2253(djkstra求最长最短边)
  6. 一致性哈希算法原理、避免数据热点方法及Java实现
  7. editplus怎么在前后插入字符
  8. AngularJs(Part 5)--与后台联系
  9. 如何更改linux文件的拥有者及用户…
  10. day5 面向对象