如何禁用apache2中的默认VirtualHost?


10

在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进行防火墙防护(也许并非针对所有客户端)相同。

Answers:


4

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

RewriteRule ^.*$ - [G]

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


我最终还是自己发现了这个解决方案。您应该添加行以加载mod_rewrite和“ RewriteEngine On”,并指出它们可能不是必需的。他们是给我的。:)
Harvey 2010年

2
另外,由于我们只是在说“已逝”或“禁止”,更重要的是,“-”可防止替换,因此正则表达式可以更简单:RewriteRule . - [F]
Harvey 2010年

17

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

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

2
这应该是公认的解决方案。+1
格雷格·施密特

我不清楚这个解决方案。我有几个VHOST文件,是否可以在其中新建一个文件?我尝试了一下,并将文件命名为001.default.conf,但仍可以重定向正在发生的子域。
Frantumn

@Frantumn如问题中所述,“主机未知的任何http请求都将被定向到第一个加载的VirtualHost ”。<VirtualHost>因此,必须首先在服务器配置中定义此“默认” 。确切地,哪个文件必须位于取决于您的配置。(但是,您的“重定向子域”问题可能是不相关的问题。)
MrWhite

嗯 当使用指向我的服务器的其他域时,它不会执行403,即使服务器名不匹配,它也会选择找到的第一个虚拟主机
jjxtra

1

这对我有用

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

用您的实际ipv4和ipv6替换xxxx,
用机器提供的实际网站替换myactualservername.com

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.