如何让 apache 在未找到匹配的 VirtualHost 部分(基于 ServerName)时发送 404?

如何让 apache 在未找到匹配的 VirtualHost 部分(基于 ServerName)时发送 404?

我正在重建一个旧服务器。五个旧站点中只有一个需要上线,并且所有五个旧站点都指向同一个 IP 地址。

不幸的是,每当通过旧网站自己的唯一域名对旧网站之一发出请求时,它们都会被传递给我试图上线的网站的页面。我只想让旧网站显示 404,而不是我实际上试图上线的网站。

举个例子:

  • 站点 1 (192.168.0.1) [www.first.com]
  • 站点 2 (192.168.0.1) [www.second.com]
  • 站点 3 (192.168.0.1) [www.third.com]

我想让站点 1 重新上线。因此,我在 IP 地址为 192.168.0.1 的机器上启用了 apache,并将站点 1 的所有文件放在 /var/www 目录中。当我浏览 192.168.0.1 或 www.first.com 时,我可以正确看到站点 1。当我浏览 www.second.com 和 www.third.com 时,我也会收到站点 1,这就是问题所在。

有没有什么办法可以让没有 www.first.com 的任何请求都变成 404 呢?

这是我的可用站点:

NameVirtualHost *:80

LogFormat "%h %l %u %t \"%r\" %>s %b" common

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

<Directory />
  Order Deny,Allow
  Deny from all
  Options None
  AllowOverride None
  Options None
</Directory>

<Directory /var/www>
  Order Allow,Deny
  Allow from all
</Directory>

<VirtualHost *:80>
        ServerName first.com
        ServerAlias www.first.com
        DocumentRoot /var/www
        ErrorLog /var/log/first.com.err
        CustomLog /var/log/first.com.log common
</VirtualHost>

<VirtualHost _default_:*>
        ServerName unknown
        DocumentRoot /var/www_404
</VirtualHost>

答案1

没有匹配的请求ServerNameServerAlias将由第一个加载的块提供服务;只需将 404 的 VirtualHost 移到顶部(它的绑定应该与它默认播放的绑定相匹配,因此将其设置为*:80- 如果没有它,通配符的 vhost 将不会收到任何请求。)

答案2

对于默认的 VirtualHost,请尝试以下步骤(在顶部,而不是底部):

<VirtualHost _default_:*>
    DocumentRoot /var/www_404
</VirtualHost>

否则,如果您在底部有名为“未知”的服务器,它将尝试搜索该服务器;-)

或者,您也可以在 VirtualHost 指令之外指定 DocumentRoot 来定义默认位置,如 Apache 文档中所述这里

编辑:对位置进行细微修正

相关内容