我最近从 2.2 升级到 2.4,在虚拟主机上遇到了访问被拒绝的问题。错误日志是
[access_compat:error] [pid 27948] [client 1.2.3.4:5] AH01797: client denied by server configuration: /var/www/mysite
现在apache2.conf
我目前有
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
在我的 vhost 文件中我有
<Directory /var/www/mysite>
Require all granted
</Directory>
但访问我的网站时出现拒绝访问错误。
在我的 vhost 配置<Directory>
部分中。
我现在需要 auth compat 模块,因为有很多.htaccess
文件依赖于它,但我不明白当我正确使用较新的Require all
语法时为什么在服务器配置级别需要它?
什么有效
如果我将以下内容放在我的虚拟主机的目录部分,它就可以工作。
Order deny,allow
将其删除(保留所有必需项),它再次失败。这就像 compat 模块默认的那样,Order allow,deny
但据我所知没有这样的语句(not in apache.conf
、not in conf-enabled/*
、not in sites-enabled/*default*
)。
Apache 文档没有说明 compat 和较新的 authz 模块如何协同工作(其网站上有一条评论指出了这一点)。我已经在其他 6 台服务器上实施了更改,没有任何问题。我已经处理了确保 .conf 位于配置文件末尾的问题。我运行了 apache2ctl configtest,我运行了 apache2ctl -S 来查看 vhosts 配置;一切都很好。
为什么需要旧的兼容 Order 语句?/为什么兼容的东西显然会覆盖较新的配置?
答案1
这不是 Apache 的错(好像它本来就是错!)。我发现我的一个 vhostOrder allow,deny
在根目录中包含一个语句,并且这个代码片段不知何故被放在了结束</VirtualHost>
元素之外。
因为 Apache 将所有启用的 vhost 都放在一个文件中,所以这相当于将其放在全局的顶层。只有逐个打开和关闭 vhost,我才能找到问题所在。
希望这个问题可以为其他人指出有用的问题。