apache开启虚拟主机localhost无法访问根目录的解决方法及问题解析

先给出解决方法:在httpd-vhosts.conf中增添以下规则即可

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "your_document_root_path"
    ServerName localhost
    ServerAlias localhost
    ErrorLog "logs/dummy-host.example.com-error.log"
    CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>

估计看一眼就明白了,localhost 其实也是一域名(不直接用IP访问的请求都是域名),所以它也必须有自己的一规则才能正常请求

但心细的同学又发现了,我虚拟主机的规则中没有一条的 ServerName 是 localhost 的,为何 apache 依然会做虚拟主机处理

localhost 其实是 localhost:80 即便你没有 localhost 的规则,但只要你有端口号是80的规则也会匹配成功,会以第一条以80作为端口的规则进行处理,这也就是当你开启80端口的虚拟主机后会发现 localhost 成了你第一条80端口的虚拟主机规则

<VirtualHost *:80>

在你使用 localhost 请求本地服务器时apache会首先根据端口号去虚拟主机规则中搜索端口号 80 的所有规则,然后在根据你的 domain_name 做进一步的匹配,若存在 ServerName 是 localhost 的规则,则按此规则处理,若不存在,则会在端口为 80 的规则中选择定义顺序为第一条的规则进行处理,若所有的规则中没有此次请求的端口号,则会采用 httpd.conf中定义的DocumentRoot作处理,比如规则全都是 80 端口,则我用 localhost:8080 去做请求时就会被定为到 httpd.conf 中定义的DocumentRoot了

虚拟主机:

1、用户发起请求

2、apache 解析本次请求的域名和端口号, 加载 httpd-vhosts.conf 中的规则

3、检查是否存在与本次请求 端口号 一致的规则,存在 3, 不存在 4

3、进一步检查 规则中是否存在 ServerName 与本次请求 域名一致的规则,若存在做对应处理【完全匹配】;若不存在,则取第一条端口号一致的规则作为处理【至少端口号一致也会被拦截下来】

4、虚拟主机规则匹配完全失败,则读取 httpd.conf 中定义的 DocumentRoot 作为规则处理请求

所以虚拟主机是按 端口号 域名 作为先后顺序进行匹配的,端口号一致则继续匹配域名,域名一致则精确匹配,若不存在域名一致的规则则端口号相同的规则集合中的第一条作为规则,若没有此端口号则访问默认根目录

你可能感兴趣的:(apache开启虚拟主机localhost无法访问根目录的解决方法及问题解析)