基于名称的虚拟主机-Apache
基于名称的虚拟主机和基于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
基于名称的虚拟主机-Apache的更多相关文章
- Apache配置基于IP的虚拟主机 Apache virtual host configuration is based on the IP
Step 1: 检查是否开启 httpd-vhosts.conf apache/conf/httpd.conf文件 # Virtual hosts Include conf/extra/httpd-v ...
- CentOS 7运维管理笔记(6)----Apache 基于 IP 的虚拟主机配置
Apache 配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置.本篇随笔记录自己基于IP的虚拟主机配置. 如果同一台服务器有多个IP,可以使用基于IP的 ...
- CentOS 7运维管理笔记(8)----Apache基于域名的虚拟主机配置
使用基于域名的虚拟主机配置是比较流行的方式,可以在同一个IP上配置多个域名并且都通过80端口访问. (1) 在网卡 eth0的第五个接口上配置 192.168.1.215 这个地址: (2) 配置/e ...
- CentOS 7运维管理笔记(7)----Apache 基于端口的虚拟主机配置
如果一台服务器只有一个IP或需要通过不同的端口访问不同的虚拟主机,可以使用基于端口的虚拟主机配置. (1) 在虚拟机的CentOS7服务器上配置 eth0:4 为192.168.1.214: (2) ...
- Nginx三种模式的虚拟主机(附Apache基于域名的虚拟主机)
1.安装nginx # pcre中文"perl兼容正则表达式",安装pcre库是为了让nginx支持具备URL重写功能 # 的Rewrite模块,rewrite可以实现动态页面转成 ...
- 高级运维(二):搭建Nginx服务器、用户认证、基于域名的虚拟主机、SSL虚拟主机、Nginx反向代理
一.搭建Nginx服务器 目标: 在IP地址为192.168.4.5的主机上安装部署Nginx服务,并可以将Nginx服务器,要求编译时启用如下功能: 1> SSL加密功能 2> 设置Ng ...
- 在Nginx中部署基于IP的虚拟主机
一.虚拟主机概念 虚拟主机是在网络服务器上划分出一定的磁盘空间供用户放置站点.应用组件等,提供必要的站点功能.数据存放和传输功能.所谓虚拟主机,也叫"网站空间", 就是把一台运行在 ...
- 虚拟主机apache
1.虚拟主机配置 windows: 1)加载配置虚拟主机的配置文件,在Apache/conf中找到httpd.conf文件,并搜索出以下的两句话,将Include conf/extra/httpd-v ...
- nginx基于域名的虚拟主机配置(本地分布式项目域名配置及测试方法)
最有用的虚拟主机配置方式. 一个域名只能绑定一个ip地址,一个ip地址可以被多个域名绑定. 可以修改host文件实现域名访问. 前提:即使我们在nginx中配置基于域名的虚拟主机,也需要域名解析,即n ...
随机推荐
- MODBUS ASCII和RTU两种模式的区别、优缺点
转自:http://blog.sina.com.cn/s/blog_89f286ad0102uzju.html 下表是MODBUS ASCII协议和RTU协议的比较: 协议 开始标记 结束标记 校验 ...
- Windows平台Python编程必会模块之pywin32
在Windows平台上,从原来使用C/C++编写原生EXE程序,到使用Python编写一些常用脚本程序,成熟的模块的使用使得编程效率大大提高了. 不过,python模块虽多,也不可能满足开发者的所有需 ...
- matlab新手入门(一)(翻译)
桌面基础知识 启动MATLAB®时,桌面将以其默认布局显示. 桌面包括以下面板: 当前文件夹 - 访问您的文件. 命令窗口 - 在命令行中输入命令,由提示符(>>)指示. 工作区 - 浏览 ...
- NOIP2015提高组 跳石头 ACM-ICPC2017香港 E(选择/移除+二分答案)
跳石头 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 NN ...
- 用 Heapster 监控集群
Heapster 是 Kubernetes 原生的集群监控方案.Heapster 以 Pod 的形式运行,它会自动发现集群节点.从节点上的 Kubelet 获取监控数据.Kubelet 则是从节点上的 ...
- Python学习笔记(迭代,列表解析,生成器)
迭代(iterable):支持每次返回自己所包含一个对象的 iter()得到迭代器,.next()遍历列表. 列表解析:根据已有列表高效生成列表的方式. 生成器(Generator): 通过列表生成式 ...
- Docker 安装部署RabbitMQ
获查询镜像 docker search rabbitmq:management 可以看到如下结果: 获取镜像 docker pull rabbitmq:management 运行镜像 docker r ...
- dom4j解析简单的xml文件 解析元素并封装到对象
package cn.itcast.xml; import cn.itcast.domain.Book; import org.dom4j.Document; import org.dom4j.Doc ...
- C# dynamic与var的区别
1.C#编程总结(十四)dynamic 2.var和dynamic的区别及如何正确使用dynamic?
- PHP EXCEL相关
这次的需求是在二次扫描的EXCEL报表中加入一列扫描时间. 扫描的时间之前已经写进日志里了,这次要做的就是把时间读取出来然后作为一列插入报表.其实日志也已经读出来了,要做的就是插入.但插入还是碰到不少 ...