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