- 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