VirtualHosts只是没有默认值?

时间:2014-07-09 18:55:20

标签: apache virtualhost document-root

我在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和子代。

我将如何实现这一目标?

1 个答案:

答案 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>