在通过包含通配符条目的 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,而不是我。他真是知识渊博!)