如何在 apache2 中禁用默认 VirtualHost?

Har*_*vey 11 virtualhost apache-2.2

在 apache2 中,任何带有未知主机的 http 请求都将被定向到第一个加载的 VirtualHost。有没有办法禁用这个功能?换句话说,我想要一个 Web 服务器,用户只能在其中访问显式命名的 VirtualHost 定义。在 ServerName 或 ServerAlias 行中未明确提及的任何其他主机名都应该被忽略。

这可能吗?

Listen 80
NameVirtualHost *

<VirtualHost _default_:*>
# Anything matching this host should be silently ignored.
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example1
ServerName www.example.com
</VirtualHost>

<VirtualHost *>
DocumentRoot /www/example2
ServerName www.example.org
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

更新:正如下面和其他地方所建议的,默默地忽略请求可能不是一个好主意,并且可能会破坏 HTTP 的 RFC。但是,由于虚拟主机旨在模拟具有多个单独的物理 HTTP 服务器,因此静默忽略方法对我来说似乎并不合理。它与基于 IP 的虚拟主机和防火墙关闭某些 IP 相同(可能不适用于所有客户端)。

小智 22

这是一种不涉及重写规则的替代方法:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的解决方案。+1 (2认同)
  • 呵呵。当使用指向我的服务器的其他域时,它不会执行 403,它只是选择它找到的第一个虚拟主机,即使服务器名称不匹配 (2认同)

EEA*_*EAA 6

我不确定“默默地失败”是个好主意。您应该至少向客户提供一些关于发生了什么情况的指示。也许您可以发送 http 410“gone”错误。像这样的事情应该可以解决问题:

RewriteRule ^.*$ - [G]
Run Code Online (Sandbox Code Playgroud)

此外,您应该能够指定自定义 410 错误文档,该文档可能只是一个空白的 html 页面。

  • 另外,由于我们只是说“Gone”或“Forbidden”,更重要的是,“-”防止替换,因此正则表达式可以更简单:`RewriteRule。- [F]` (2认同)