如何禁用 Apache 中的默认文档根目录?

如何禁用 Apache 中的默认文档根目录?

我在运行 Apache Httpd 的服务器上托管一些网站。每个网站都有自己的域或子域和虚拟主机。因此,我不需要默认的文档根目录。是否可以DocumentRoot禁用/etc/httpd/conf/httpd.conf

答案1

感谢其他回答。我通过添加一个没有任何权限的默认虚拟主机解决了这个问题。全局DocumentRootServerName选项必须与虚拟主机中指定的选项匹配。

/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,则将使用匹配的第一个列出的虚拟主机。

相关内容