Apache权限被拒绝

16

我刚刚在Windows上安装了一个新的Apache 2.4.2版本,并使用Php fast cgi构建。

然后,我修改了httpd.conf文件,添加了以下内容:

LoadModule fcgid_module modules/mod_fcgid.so  
FcgidInitialEnv PHPRC "C:/SITE/PHP"
AddHandler fcgid-script .php
FcgidWrapper "C:/SITE/PHP/php-cgi.exe" .php

DocumentRoot "C:/SITE/localhost/www"
<Directory "C:/SITE/localhost/www">
    Order allow,deny
    Allow from all
</Directory>

然而,当我尝试打开我的网站时,它显示:

Forbidden You don't have permission to access / on this server.

有什么想法是什么问题吗?


1
index.php 的权限是什么? - Florin Stingaciu
1
老实说,我真的不知道。上面的代码不是应该允许所有文件吗?无论向服务器发送什么请求,例如 http://127.0.0.1/asdasdasd,我都会得到相同的响应结果。 - Anonymous
1
不允许/允许是Apache是否向客户端提供资源的指令 - 但Apache仍然需要访问文件。把Apache想象成你电脑上的一个用户...如果你不给它访问文件的权限,那么它就无法提供这些文件。 - prodigitalson
1
啊哈,我现在明白了。不知道如何给予Apache足够的权限呢?是被某些配置或Windows本身限制了吗?有没有什么方法可以找出/解决这个问题?我会非常感激您的建议。 - Anonymous
2
马上浮现在脑海中的一个要点是,您的<Directory>部分至少缺少一个至关重要的指令 - 您需要在其中添加一个Options ExecCGI指令。您还应该加入一个明确的AllowOverride all(或none)指令。此外,OrderAllow已被弃用 - 如果您使用2.4.x,请使用mod_authz_host提供的新的Require指令。 - DaveRandom
显示剩余7条评论
1个回答

29

这是正确的做法:(感谢DaveRandom)

<Directory "C:/SITE/localhost/www">
    Options ExecCGI
    AllowOverride all
    Require all granted
</Directory>

Dave Random进一步解释:

经过一番实验,我发现了这个正确答案的微妙之处,它只适用于Apache 2.3+。看来mod_authz_host指令优先于mod_access_compat指令,并且这个优先级一直向上冒泡至整个目录树。这意味着如果你从Apache 2.2迁移到Apache 2.4并且直接使用原始的2.2 httpd.conf文件,那么它会正常工作。

但是,如果你在新的2.4版本上执行安装,并以默认的2.4 httpd.conf为基础进行配置,那么Allow指令将不起作用,因为默认的顶层<Directory>部分使用Require all denied指令而不是Deny from all指令,这将优先于树高处的任何后续Allow指令。简而言之,如果你将Order/Allow/Deny指令迁移为它们等效的Require指令,那么你必须改变它们中的所有内容,否则你将发现得到了意外的403错误。


10
在对此进行一些实验后,我发现了使这成为正确答案的细微差别,这个差别只适用于Apache 2.3+。似乎mod_authz_host指令比mod_access_compat指令优先,并且这会一直冒泡到整个目录树。这意味着,如果你从Apache 2.2迁移到Apache 2.4并完全使用2.2的httpd.conf文件,它将可以工作。【续在下一条评论中】 - DaveRandom
15
然而,如果您执行了2.4的新安装并基于默认的2.4 httpd.conf进行配置,那么"Allow"指令将不起作用,因为默认的顶级"<Directory />"部分使用了"Require all denied"指令而不是"Deny from all",这将优先于任何更高级别树中的后续"Allow"指令。简言之,如果您正在将您的"Order"/"Allow"/"Deny"指令迁移到它们相应的"Require"指令,则必须全部更改,否则您将发现会得到意外的403错误。 - DaveRandom
4
在我做了一些实验(更重要的是重新仔细阅读手册)之后,似乎Options ExecCGI对于mod_fcgid不是必需的,它只对mod_cgi有影响。AllowOverride all也不是使其正常工作所必需的 - 但是如果没有它(或者至少允许某些内容的AllowOverride指令),你将无法使用.htaccess文件。我强烈建议您阅读并理解这些指令的手册,以及可能的取值。 - DaveRandom
对于任何对2.2到2.4更改感兴趣的人,请参见此处:https://httpd.apache.org/docs/trunk/upgrading.html - Joel Mellon
2
我刚刚在 Windows 8.1 (64-bit) 上的 Apache 2.4 VC11 (来自 Apache Lounge) 上安装了 PHP 5.5 VC11 NTS。对我而言,关键是添加 Options ExecCGI。如果没有它,Apache 就无法启动任何 FCGI 进程,只会返回 403 权限被拒绝。 - Aleš Krajník
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接