apache - VirtualHosts ONLY 没有默认值?

标签 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 地址访问网络服务器时,默认脚本运行,这是不需要的。我希望 IP 地址显示自定义 404 或其他内容。

编辑 |我重新启用了“默认”站点,希望能阻止所有访问——当然不包括每个虚拟主机及其文档根目录和子目录。

我将如何实现这个目标???

最佳答案

您的虚拟主机缺少 ServerName这将允许 HTTP request hostname<->Virtualhost映射。

所以,首先,添加右Servername在虚拟主机上。

然后,如果您希望所有其他名称呈现 404,您绝对需要一个默认的虚拟主机。此默认虚拟主机将捕获在 HTTP 请求中使用无法识别的主机 header 的任何请求(因此基于 IP 的访问,或与您的 IP 关联的其他 DNS,或伪造的主机 header )。

默认的 Virtualhost 是 apache 配置中第一个加载的,在类 debian 系统中,包含的文件以 00 为前缀并且包含的​​目录按字母顺序加载以强制执行此状态。您始终可以使用 -S 选项检查哪个虚拟主机是默认虚拟主机。

# debian-like
apachectl -S
# redhat like
httpd -S

然后,如果您希望对默认 Virtualhost 的所有这些访问都呈现 404,您只需要使此 Virtualhost 变得非常简单(删除所有默认废话总是一个好主意)并为所有内容提供 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 请求主机 header 操纵的绝对保护(它们仍然是将您的 Virtualhost 与绝对 URI 和伪造的主机 header 相匹配的奇怪方法)但这是一个很好的开始。

如果你想确保到达你的虚拟主机的 HTTP 请求的主机头是虚拟主机中定义的(并且只有那个)你可以在最终的虚拟主机上添加一个 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>

关于apache - VirtualHosts ONLY 没有默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661687/

相关文章:

php - (让进程运行直到完成,浏览器关闭后)

apache - 无法提供目录/var/www/html/: No matching DirectoryIndex

php - 在用户注册时创建子域

ruby - 如何用vagrant和chef创建虚拟主机

windows - 我到处寻找改变Apache上的DocumentRoot但无济于事

java - NTLM 身份验证的客户端资源发布失败。适用于 apache 中的基本身份验证

django - Apache Django URL 问题

linux - AWS-EC2,如何用一个实例设置多个公共(public)站点?

windows - Apache DocumentRoot 到虚拟主机的网络目录

php - DOCUMENT_ROOT 不完整,缺少域文件夹