Apache服务器上的Httpd文件权限

时间:2012-03-21 11:13:32

标签: php apache file-permissions

我总是使用以下代码在Apache服务器上创建一个文件夹,但最近在其中一个服务器上我已经获得了权限拒绝错误。

if(!is_dir('img/user/'.$id))
{
    mkdir('img/user/'.$id, 0777, true);   
    chmod('img/user/'.$id, 0777); 
}

在互联网上,我发现要上传httpd needs to have write permissions的目录,如下所示:

drwxrwxrwx   2 user     staff   512 Jan 07 12:32 uploads/

此权限设置在何处?我不直接访问服务器。还有什么选择吗?

2 个答案:

答案 0 :(得分:1)

如果您可以避免使用权限,甚至可读性,那么您永远不希望将权限设置为全局可写。如果仍然有点广泛,0770将是更好的选择。重点是有问题的文件夹需要由webserver用户写入。例如,在许多webhosts上,apache将由用户nobody运行,因此更合适的权限将如下所示:

drwxrwx---   2 nobody     nobody   512 Jan 07 12:32 uploads/

现在,如果您无法通过PHP自行直接访问设置权限,则会出现问题,因为某些Web主机将无法在PHP中运行chmod或其他权限或所有权修改。也就是说,如果您正在使用cPanel(可能还有其他托管系统也这样做),您可以使用在线文件管理器通过浏览到相应的目录并使用位于顶部的change permissions来完成您想要的操作。页面。

因此,最终,这就是您所需要的:如果您需要能够在特定位置创建目录,则需要确保Web服务器可以写入该位置。在您的示例中,这意味着您需要先在img/user上设置适当的权限,然后再尝试创建img/user/$id。这意味着img/user必须具有0770的权限,并且必须由nobody:nobody拥有(用户或组在此上下文中工作,您不需要两者),或者必须拥有0777的权限。然后,当您创建特定的用户目录时,您可以这样做:

if(!is_dir('img/user/'.$id))
{
    mkdir('img/user/'.$id, 0770, true);
}

...因为它已经由相应的用户拥有,并且您已经拥有了对它的写入权限,只是因为您的网络服务器首先创建了它。

如果你找不到非PHP方式,那么你必须得到你的虚拟主机帮助。

答案 1 :(得分:0)

PHP以用户身份运行:www-data in group:www-data(Ubuntu)或其他东西,具体取决于服务器操作系统。 如果您无法通过FTP自行完成,您可以要求您的提供商在地图/文件上设置正确的访问权限。