Apache HTTPD:“服务器配置拒绝客户端:.htaccess”,即使 .htaccess 为空

Apache HTTPD:“服务器配置拒绝客户端:.htaccess”,即使 .htaccess 为空
  • Windows 7 旗舰版(64 位)
  • Apache HTTP 服务器 2.2.15(32 位)
  • PHP 5.3.2(32 位)

httpd.conf 是默认的,除了我取消了 mod_rewrite 的行和加载 httpd-vhosts.conf 的行,如下所示:

#
# Virtual Hosts
#
# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn't need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at 
# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
# for further details before you try to setup virtual hosts.
#
# You may use the command line option '-S' to verify your virtual host
# configuration.

<Directory "D:/Path/To/Sites">
  Options Indexes
  Order Deny,Allow
  Allow from all
</Directory>

#
# Use name-based virtual hosting.
#
NameVirtualHost *:80

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ServerName or ServerAlias in any <VirtualHost> block.
#
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "D:/Path/To/Site 1"
    ServerName site1.local
    ServerAlias www.site1.local
    ErrorLog "logs/site1.local-error.log"
    LogLevel debug
    CustomLog "logs/site1.local-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "D:/Path/To/Sites/Site 2"
    ServerName site2.local
    ServerAlias www.site2.local
    ErrorLog "logs/site2.local-error.log"
    LogLevel debug
    CustomLog "logs/site2.local-access.log" common
</VirtualHost>

<VirtualHost *:80>
   DocumentRoot "D:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"
   ServerName localhost
</VirtualHost>

Windows hosts 文件将 site1.local 和 site2.local 转发至 127.0.0.1。

当尝试访问 site2.local 时,.htaccess 显然被忽略了。在 site2.local-error.log 中,每次我尝试访问时,唯一的错误是:

[2010 年 7 月 21 日星期三 17:57:06] [错误] [客户端 127.0.0.1] 服务器配置拒绝客户端:D:/Path/To/Sites/Site 2/.htaccess

但是,即使我删除了 .htaccess 中的所有内容,我仍然会收到相同的错误。在 VirtualHost 内移动目录没有任何区别;将站点 2 的内容移动到 htdocs 也没有区别。

答案1

显然,.htaccess 没有被读取,因为我不允许配置覆盖;如果我将“AllowOverride All”添加到我的虚拟主机目录,它就可以工作了 — 除了 mod_rewrite,因为出现以下错误:

选项 FollowSymLinks 或 SymLinksIfOwnerMatch 处于关闭状态,这意味着禁止使用 RewriteRule 指令

在我添加了 Options FollowSymLinks 之后,一切就正常了。

最终代码:

<Directory "D:/Path/To/Sites">
  Options Indexes FollowSymLinks
  AllowOverride All
  Order Deny,Allow
  Allow from all
</Directory>

答案2

我在本地使用 Apache 和 Windows 时遇到了这个问题,但这不是 AllowOverride 的问题。我最终用一种非常暴力的方式解决了这个问题,你永远不应该在实时服务器上使用这种方法,但对我来说却很有效,因为它只是一个本地环境:

<FilesMatch "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</FilesMatch>

我不明白为什么阻止 Apache 提供 .htaccess 文件的逻辑是阻止它们在 VirtualHost 中使用。我确信我设置错了,但对我来说,快速修复方法是删除整个块。

答案3

请注意,我刚刚遇到了这个问题。Order + Deny | Allow 绝对是罪魁祸首。

事实上,我刚刚安装的应用程序在每个目录中都有一个 .htaccess 文件,而我尝试查看的目录必须是要接受连接的确切目录。

为了找到问题,我查看了每个目录的 .htaccess 文件...在 URI 末尾添加 index.php 有所帮助,尽管事实是我没有添加结尾的 / 并且父目录禁止访问目录文件。

因此,以下操作将会失败,因为安装目录中的 .htaccess 禁止访问所有内容:

http://exmaple.com/admin/install

下面的代码就可以正常工作:

http://exmaple.com/admin/install/
http://exmaple.com/admin/install/index.php

相关内容