我似乎无法解释 Apache 接受裸域上的请求,但忽略来自子域的任何内容。我觉得这应该很容易,但我发现的一切都与重定向子域请求有关,而不是忽略它们。
我当前的设置:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
</VirtualHost>
访问something.example.com
指向example.com
,我希望它失败并显示404 not found
。我可能可以使用 排除所有内容,mode_rewrite
但这是最好的解决方案吗?或者我应该在 DNS 级别执行此操作?
感谢您帮助我解决这样一个新手问题。
答案1
您可以创建第二个虚拟主机,作为万能主机,只返回 404。大致如下:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
</VirtualHost>
<VirtualHost *:80>
ServerName a.example.com
ServerAlias *.example.com
RewriteRule ^ - [R=404]
</VirtualHost>
- 如果请求到达
*:80
并要求,example.com
它将由第一个虚拟主机处理。 - 如果请求到达
*:80
并要求,*.example.com
它将由第二个虚拟主机处理。
答案2
根据 mauro.stettler 的回答,我发现了一些有效的方法:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
</VirtualHost>
<VirtualHost *:80>
ServerName *.example.com
ServerAlias *.example.com
Options -Indexes
</VirtualHost>
它抛出一个403 Forbidden
而不是一个,404 Not found
但是这样就可以了。
如果没有该-Indexes
部分,它会显示我的目录的目录结构/var/www
。这会是 Apache 默认使用的后备方案吗?
答案3
第一个虚拟主机是默认主机,将匹配每个未知 VH 的请求
做这样的事:
# First VH
<VirtualHost *:80>
ServerName loalhost
DocumentRoot /var/www/default
</VirtualHost>
# Second and more VH
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/example
</VirtualHost>