如何在 apache2 中禁用默认 VirtualHost?

如何在 apache2 中禁用默认 VirtualHost?

在 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>

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

答案1

我不确定“默默失败”是不是一个好主意。你应该至少给客户一些指示发生了什么。也许你可以发送一个 http 410“消失”错误。类似下面的代码应该可以解决问题:

RewriteRule ^.*$ - [G]

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

答案2

以下是不涉及重写规则的另一种方法:

<VirtualHost _default_:*>
    <Location />
        Deny from all
        Options None
        ErrorDocument 403 Forbidden.
    </Location>
</VirtualHost>

答案3

这对我有用

<VirtualHost x.x.x.x:80 [x:x::x:x:x:x]:80>
  ServerName myactualservername.com
  ServerAlias *
  <Location />
    Deny from all
    Options None
    ErrorDocument 403 Forbidden.
  </Location>
</VirtualHost>

将 xxxx 替换为你的实际 ipv4 和 ipv6
将 myactualservername.com 替换为机器服务的实际网站

我正在使用基于名称的虚拟主机。
此解决方案归功于
https://serverfault.com/a/82309/459796

答案4

我尝试了这里列出的所有其他答案,但它们都无法阻止通过 IP 发出的请求。

相反,我选择默认拒绝所有内容(Require all denied而不是将其他任何内容作为默认安全模型),并明确将域列入白名单

<VirtualHost my.domain.com:443>

相关内容