如果我正确理解NameVirtualHost的概念,它将通过读取每个HTTP请求的Hostvariables并将其与匹配接口和端口的任何活动VirtualHost指令中的ServerName
匹配。 如果发现一个匹配的ServerName
,则将该VirtualHost的内容提供给客户端。
主机variables可以很容易被客户伪造。 所以在以下configuration中:
Listen 80 NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot /super/secret/files ServerName localhost </VirtualHost> <VirtualHost *:80> DocumentRoot /var/www/webserver ServerName www.example.org </VirtualHost>
客户端可以简单地将localhost
作为Host的值并访问秘密文件。 所以你不能依赖于ServerName
并且必须使用Order
, Allow
, Deny
(OAD)指令。
example.org/phpmyadmin
,用户仍然得到403 Forbidden
错误。 我将如何configurationApache甚至不在非本地主机连接上提供此VirtualHost? 一个单独的<NameVirtualHost localhost:80>
也许? Host:
头只检查VirtualHost
Host:
是侦听接口/ IP地址请求进来。 通配符意味着虚拟主机可以用于来自任何接口的请求。
如果您不希望人们访问localhost
虚拟主机,请明确指定其IP地址,而不是允许其从所有接口提供服务:
<VirtualHost 127.0.0.1:80 [::1]:80> ServerName localhost ....
PS您需要为本地主机指定IPv6地址,因为它在任何现代系统上都正在使用,默认情况下优先于IPv4。