Apache 虚拟主机是否只有默认值?

Apache 虚拟主机是否只有默认值?,apache,virtualhost,document-root,Apache,Virtualhost,Document Root,我在Apache上安装了debian。我禁用了“默认”站点,现在只添加了一个 我想禁用对所有内容的访问,除了各种vhost下的内容 <VirtualHost *:80> DocumentRoot /var/www/mycompany/websites/corporate <Directory /var/www/mycompany/websites/corporate> Order deny,allow Allow from all Opti

我在Apache上安装了debian。我禁用了“默认”站点,现在只添加了一个

我想禁用对所有内容的访问,除了各种vhost下的内容

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

DocumentRoot/var/www/mycompany/websites/corporate
命令拒绝,允许
通融
选项如下符号链接
DocumentRoot/var/www/mycompany/websites/leisure
命令拒绝,允许
通融
选项如下符号链接
这没有效果。问题是当我通过IP地址访问Web服务器时,默认脚本会运行,这是不需要的。我希望IP地址显示一个自定义的404或其他

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


我如何实现这个目标?

您的虚拟主机缺少
ServerName
,这将允许
HTTP请求主机名virtualhost
映射

因此,首先,在Virtualhosts上添加右侧的
Servername

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

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

# 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>
”-您应该指定DocumentRoot的路径,而不是服务器根目录,否则您将授予对整个服务器的访问权限。例如,
<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>