1. 虚拟主机概念
我们要想实现一个web站点,而且能够在互联网上被访问,首先它再能运行在操作系统,而且这个操作系统还要运行在物理主机上(第一它是一个主机)。在互联网上能够被访问,那我们需要一个主机,需要一个IP地址,需要一个时时在线的服务器,这需要多少资源?对众多小型站点来讲或者说对某种需求来讲,有可能都用不到服务器,也就是每天就10个人左右访问,只是需要我们在线而已,如果我们就为这一点点的需求就投入重大的资源的话是非常浪费的。我们就期望能够像我们使用虚拟机一样,虚拟的OS一样或虚拟的PC一样,能够在一台物理主机上虚拟出来多个可以同时运行的站点或者我们把它称为主机因此就把它称为虚拟主机。
2. Apache 主机的类型
1. 中心主机
2. 虚拟主机
- 基于IP: 端口相同,IP地址不同。
- 基于端口:IP相同,端口不同。
- 基于域名:IP地址相同,端口相同主机名不同
注意:所有的虚拟主机的配置我们都需要取消中心主机,也就是注释掉 DocumentRoot 这是配置虚拟主机的前提
3. 基于域名的虚拟主机
例如我采用的 xampp 所以配置虚拟主机就在 C:\xampp\apache\conf\extra\httpd-vhosts.conf
中配置,由于这个文件默认被 include 到主配置文件中了,所以在这里的修改都可以生效。
首先需要保证主配置文件中的中心主机被取消了也就是:
#DocumentRoot "C:/xampp/htdocs"
然后打开 httpd-vhosts.conf
配置文件,按照下面的格式配置虚拟主机
<VirtualHost *:80>
DocumentRoot "C:/xampp/htdocs"
ServerName localhost
<Directory "C:/xampp/htdocs">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
1. <VirtualHost *:80>
apache监听本机的所有 IP 和 80 端口做多域名虚拟主机
2. DocumentRoot
表示服务器的根目录
3. ServerName
就是表示域名,我们采用域名方式配置虚拟主机,所以每个虚拟主机的域名应该是不一样的才行
4. Directory
对根目录的规则应用,其中涉及到对于目录的访问权限和其他配置问题
5. 对于 Directory 指令解析
1. Options
配置在特定目录使用哪些特性,常用的值和基本含义如下
- ExecCGI: 在该目录下允许执行CGI脚本。
- FollowSymLinks: 在该目录下允许文件系统使用符号连接。
- Indexes: 当用户访问该目录时,如果用户找不到DirectoryIndex指定的主页文件(例如index.html),则返回该目录下的文件列表给用户。
- SymLinksIfOwnerMatch: 当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。
所以我们一般在配置 PHP 的时候所配置的内容是
Options Indexes FollowSymLinks Includes ExecCGI
2. AllowOverride
允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定):
- None: 当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。
- All: 在.htaccess文件中可以使用所有的指令。
建议关闭这个选项,因为apache在文档中已经明确支持不建议使用它了,主要是会降低服务器性能,.htaccess 文件可以做到的我们都可以在 Directory 指令中做的更好。
3. Order
控制在访问时Allow和Deny两个访问规则哪个优先,也就是黑白名单的匹配顺序
- Allow:允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16)。
- Deny:拒绝访问的主机列表。
更详细的用法可参看:order用法
匹配原则:
Allow,Deny
First, all Allow
directives are evaluated; at least one must match, or the req