我在运行 Apache Httpd 的服务器上托管一些网站。每个网站都有自己的域或子域和虚拟主机。因此,我不需要默认的文档根目录。是否可以DocumentRoot
禁用/etc/httpd/conf/httpd.conf
?
答案1
感谢其他回答。我通过添加一个没有任何权限的默认虚拟主机解决了这个问题。全局DocumentRoot
和ServerName
选项必须与虚拟主机中指定的选项匹配。
/etc/httpd/conf/httpd.conf
...
ServerName <server-ip>:80
DocumentRoot "/var/www/html"
<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
...
/etc/httpd/conf.d/默认.conf
<VirtualHost *:80>
ServerName <server-ip>
DocumentRoot /var/www/html
</VirtualHost>
这样,当直接通过服务器的 IP 访问服务器时,我会收到 403 Forbidden 消息,这正是我想要的。如果我不需要/var/www/html
现有目录就更好了,但如果我指定类似的东西,Apache 会抱怨/dev/null
。
答案2
是也不是。
您可以注释掉或删除DocumentRoot
指令,没问题。但是这并没有多大用处,因为它会默认为PREFIX/htdocs/
构建 apache 时设置 PREFIX 的默认目录。
当您设置了 VirtualHosts 时,所有未由明确配置的虚拟主机处理的请求都将由默认虚拟主机(通常是第一个,但httpd -S
会告诉您)处理。
答案3
我不确定你是否想这样做。如果 apache 配置中没有默认 vhost,则第一个定义的 vhost 将成为默认。
您真正需要做的就是让默认页面显示为空白页。
答案4
在您的 /etc/httpd/conf/httpd.conf 中,如果您的 Listen 指令是
Listen 80
这意味着
*:80
您在 /etc/httpd/conf/httpd.conf 和 /etc/httpd/conf.d/default.conf 中定义了几个相同的<listener>
+ : + 。因此,Apache 仅考虑一个。<servename>
*:80
<server-ip>
因此,您的 vhost 配置没有用。
您的 /etc/httpd/conf/httpd.conf 足以阻止对您的 /var/www/html 目录的访问。
只需添加:
<Directory /var/www/html>
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
请阅读https://httpd.apache.org/docs/2.4/en/vhosts/name-based.html#alg:
服务器如何选择合适的基于名称的虚拟主机
重要的是要认识到,基于名称的虚拟主机解析的第一步是基于 IP 的解析。基于名称的虚拟主机解析仅在将候选范围缩小到最佳基于 IP 的匹配后才选择最合适的基于名称的虚拟主机。在所有 VirtualHost 指令中对 IP 地址使用通配符 (*) 会使此基于 IP 的映射变得无关紧要。
当请求到达时,服务器将根据请求使用的 IP 地址和端口找到最佳(最具体)匹配参数。如果有多个虚拟主机包含此最佳匹配地址和端口组合,Apache 将进一步将 ServerName 和 ServerAlias 指令与请求中存在的服务器名称进行比较。
如果您从任何基于名称的虚拟主机中省略 ServerName 指令,则服务器将默认使用从系统主机名派生的完全限定域名 (FQDN)。这种隐式设置的服务器名称可能会导致违反直觉的虚拟主机匹配,因此不建议这样做。
IP 和端口组合的默认基于名称的虚拟主机如果在包含最具体匹配的 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。