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

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

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

我的问题:

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

我研究了以下可能性:

  • 将任何无效子域名重定向到主页或其他页面。

    这种方法的问题是,当有人以 this.company.sucks.example.com 的形式链接到您的网站时,如果我不重定向,客户将看到您的主页,或者在我的情况下是 000-default。谢谢麦克风指出这一点。(“suck”等正则表达式绝对不是一个选项)

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

    Apache 不喜欢这一点,每次重新加载都会发出警告。除了警告之外,一切似乎都很好。这看起来像是一种黑客行为。这对任何人来说都像是一个问题(无论多小)吗?

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

    这很令人困惑,并且会使以下情况变得过于复杂:例如,您为每个用户使用一个子域(这显然是使用通配符 DNS 的一个重要原因),并且用户可以在 username.example.com 上查看彼此的个人资料。这种解决方案会让用户感到困惑,而且完全不是我想要的。

我理想的解决方案是让用户知道他输入的 URL 上没有任何内容可查看。最好是输入的地址出现 404 错误和错误日志条目(而不是其他地址)。

任何帮助将不胜感激!

答案1

我最近遇到了同样的问题,直到现在才找到解决方案。最好的选择是使用

Redirect 404 /

或(如前所述)

RedirectMatch 404 /.*

默认(第一个)虚拟主机中的指令,显然必须未使用。虚拟主机可能是一个“假”虚拟主机,因此在虚拟主机配置文件的开头应有类似以下内容:

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

<VirtualHost *.80>
ServerName example.tld
........
</VirtualHost>

但闻起来却像黑客行为。

答案2

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

RedirectMatch 404 /.*

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

如果它不起作用请告诉我。

答案3

这可能会有所帮助:我试图解决我之前为自己设置的通配符子域名问题,并从 webmasterworld(来自无所不知的 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.com,则内容会显示出来。如果我导航到http://baz.foo.com,我会得到一个404 Not Found(以及一个额外的信息性 404,因为我没有指定 ErrorDocument)——这也会出现在 中error_log

这就是你想要的吗?使用此功能可以让你看到 中不可用的内容error_log,或者创建一个 404 页面,专门用于捕获 404 请求并记录它们。

(再次强调,这要感谢 WMW 上的 jdMorgan,而不是我。他真是知识渊博!)

相关内容