通配符DNS,apache2上的VirtualHosts,404未使用的子域名

在由包含通配符条目(例如* .example.com)的DNS链接的Apache2服务器上,在任何VirtualHost中未定义为ServerNames的子域指向第一个定义的VirtualHost,在我的示例中,这是000-default。

我的问题:

如何获得未使用的子域(在任何虚拟主机中未使用的子域)向发出请求的客户端返回404错误? 最好在服务器日志中显示为404。

我研究了以下几种可能性:

  • 将任何无效的子域名redirect到主页或其他页面。

    这种方法的问题是,当有人链接到您的网站this.company.sucks.example.com,客户端将会看到您的主页或在我的情况下000-default,如果我不redirect。 谢谢, 麦克指出了这一点。 (正则expression式“吸”等肯定不是一个选项)

  • 让默认的VirtualHost指向一个不存在的目录。

    Apache不喜欢这一点,每次重新加载警告。 除了警告,一切似乎都很好。 这似乎是一个黑客。 这对任何人来说似乎都是一个问题(不pipe多么小)?

  • 将默认的VirtualHost指向index.php被禁止的文件夹,从而创build一个403状态码。

    这是令人困惑的,并使得以下事情过于复杂:例如说,您使用每个用户的子域(显然是使用通配符DNS的一个重要原因),并且用户能够在username.example中查看其他configuration文件。 COM。 这个解决scheme让用户感到困惑,完全不是我想要做的。

我的理想sollution将让用户知道没有什么可以查看他input的url。 最好有一个404和input地址的错误日志条目(而不是其他地址)。

任何帮助将不胜感激!

我最近有同样的问题,直到现在还找不到灵魂。 最好的select结果是使用

Redirect 404 / 

或(如前所述)

 RedirectMatch 404 /.* 

指令在默认(第一)虚拟主机,显然必须是未使用的。 虚拟主机可能是一个“虚假”的,所以像你的虚拟主机configuration文件的开头:

 <VirtualHost *:80> ServerName default #fake name, unused domains default here Redirect 404 / </VirtualHost> <VirtualHost *.80> ServerName example.tld ........ </VirtualHost> 

闻起来像一个黑客。

根据Apache文档,您可以使用以下设置默认的虚拟主机:

 RedirectMatch 404 /.* 

http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect

让我知道如果它不起作用。

这可能有所帮助:我试图解决一个早先我自己设置的通配符子域问题,并从webmasterworld中find了一些示例代码(来自全知的jdMorgan),它似乎产生了你以后的行为(404关于不存在的内容):

 #jdMorgan, again #http://www.webmasterworld.com/apache/3906038.htm # If the request is not for the the main domain or the www subdomain rewriteCond %{HTTP_HOST} !^(www\.)?foo\.com # get the requested subdomain name into variable %2 rewriteCond %{HTTP_HOST} ^(www\.)?([^.]+)\.foo\.com # and if not already rewritten to subdomain's subdirectory rewriteCond $1 !^subdomains/ # internally rewrite to prefix "/subdomains/<subdomain-name>/" to the client-requested URL-path rewriteRule ^(.*)$ /subdomains/%2/$1 [L] 

如果/subdomains/bar存在文件,并且导航到http://bar.foo.comhttp://bar.foo.com显示内容。 如果我导航到http://baz.foo.com ,我得到一个404 Not Found (和一个额外的信息404,因为我没有指定ErrorDocument) – 这也出现在error_log

这是你在追求什么? 通过这种方式,您可以在error_log查看不可用的内容,或者确实创build404页面来捕获404请求并logging它们。

(再次,WMW上有jdMorgan来感谢这个,而不是我,那个人真的是知识的来源!)