我在Apache上设置了debian。我暂时禁用了“默认”网站并添加了一个网站。
我想禁止访问除以外的所有以外的所有内容。
<VirtualHost *:80>
DocumentRoot /var/www/mycompany/websites/corporate
<Directory /var/www/mycompany/websites/corporate>
Order deny,allow
Allow from all
Options FollowSymLinks
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/mycompany/websites/leisure
<Directory /var/www/mycompany/websites/leisure>
Order deny,allow
Allow from all
Options FollowSymLinks
</Directory>
</VirtualHost>
这没有效果。问题是当我通过IP地址访问Web服务器时,运行默认脚本,这是不希望的。我希望IP地址显示自定义404或其他内容。
编辑|我已经重新启用了“默认”网站,希望阻止所有访问 - 当然不包括每个虚拟主机及其docroots和子代。
我将如何实现这一目标?
答案 0 :(得分:1)
您的虚拟主机缺少允许ServerName
映射的HTTP request hostname<->Virtualhost
。
因此,首先,在Virtualhosts上添加正确的Servername
。
然后,如果您希望所有其他名称都呈现404,则您绝对需要默认的虚拟主机。此默认虚拟主机将使用HTTP请求中的无法识别的主机标头捕获任何请求(因此基于IP的访问,或与您的IP关联的其他DNS或伪造的主机标头)。
默认的Virtualhost是在apache配置中加载的第一个,在类似debian的系统中,包含的文件以00
为前缀,并且包含的dirs按字母顺序加载以强制执行此状态。您始终可以使用-S选项检查哪个Virtualhost是默认的。
# debian-like
apachectl -S
# redhat like
httpd -S
然后,如果你想要所有这些访问默认的虚拟主机来渲染404你只需要使这个虚拟主机像一个非常简单的(总是一个好主意删除那里的所有默认废话)与eveything的404响应:
<Virtualhost *:80>
ServerName _default
# do not set that docroot as a parent of real doc root
# you do not want to let access to /var/www/mycompany as /company
# so create that directory
DocumentRoot /var/www/default
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access-default.log combined
<Directory />
Options FollowSymLinks
AllowOverride None
# apache<2.3 syntax
Order allow,deny
allow from all
</Directory>
# Now catch everything and throw a 404
# you'll need mod_alias for that (usually already there)
RedirectMatch 404 ^(.*)
</Virtualhost>
这不是对HTTP请求主机头操作的绝对保护(它们仍然是将您的Virtualhost与绝对URI和伪造主机头匹配的奇怪方法),但这是一个非常好的开始。
如果要确保到达Virtualhost的HTTP请求的HOST标头是Virtualhost中定义的那个(并且只有那个),您可以在最终的Virtualhost上添加mod_rewrite检查。
因此,在您的示例中,对于目录leisure
,假设ServerName
应为www.leisure.com
。在Directory
中我会添加:
<Directory /var/www/mycompany/websites/leisure>
Order deny,allow
Allow from all
Options FollowSymLinks
# not the right domain? -> 403
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.leisure\.com [NC]
RewriteRule .* - [F,L]
</Directory>