PHP mkdir:权限被拒绝的问题


99

我正在尝试使用PHP mkdir函数创建目录,但出现如下错误:Warning: mkdir() [function.mkdir]: Permission denied in ...。如何解决问题?


2
平台/ Web服务器/操作系统?
萨尔曼A

1
请查看以下问题:http : //stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir我遇到了同样的问题,这里的答案刚刚解决了我的问题。如果您在Linux上运行,那么那里有关SELinux的答案可能适用于您。
Lucas Madureira 2014年

Answers:


171

我知道这是一个旧线程,但是需要一个更好的答案。您不需要将权限设置为777,这是一个安全问题,因为它提供了对世界的读写访问权限。可能是您的apache用户对该目录没有读/写权限。

这是您在Ubuntu中所做的

  1. 确保所有文件均归Apache组和用户所有。在Ubuntu中,它是www-data组和用户

    chown -R www-data:www-data /path/to/webserver/www

  2. 接下来,使www-data组的所有成员能够读写文件

    chmod -R g+rw /path/to/webserver/www

php mkdir()函数现在应该可以正常工作而不会返回错误


3
好答案!希望随着时间的流逝,它会到达页面顶部!
高度不规则的2014年


Apache确实需要写缓存和日志之类的权限的权限……这只是微调的问题。
Manatax

@simpleengine嗨,我已经注意到您的回答了。我正在尝试在CodeIgnter中创建并在Ubuntu 14.14 Lts中开发的项目也面临着同样的问题。请您向我详细解释我需要采取的步骤为了解决此错误而做?为您提供更多信息:绝对路径是/opt/lampp/htdocs/www/my-app/public/uploads..基本上,我要尝试的是每个登录用户在uploads文件夹中上传文件,并创建相册文件夹(将使用php来完成)以存储照片..
ltdev

5
我不喜欢那些一直在说“这是不安全的”而没有显示出这样做的安全方式的用户。
che-azeh

38

以后通过Google找到此邮件的人的最新答案。我遇到了同样的问题。

注意:我在MAC OSX LION上

发生的是,apache以“ _www”用户身份运行,并且没有编辑任何文件的权限。您会注意到没有文件系统功能通过php起作用。

怎么修:

打开查找程序窗口,然后从菜单栏中选择“转到”>“转到文件夹”> / private / etc / apache2

现在打开httpd.conf

找:

User _www 
Group _www

更改用户名:

User <YOUR LOGIN USERNAME>

现在,通过运行以下表单终端重新启动Apache:

sudo apachectl -k restart

如果仍然无法使用,我在执行上述操作之前碰巧要执行以下操作。可能相关。

打开终端并运行以下命令:(请注意,我的Web服务器文件位于/ Library / WebServer / www。根据您的网站位置进行更改)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
此解决方案有效,但允许Apache在有人执行恶意代码(例如通过Shellshock漏洞利用)的情况下对您的系统造成严重破坏。一种替代方法是让Apache以的身份执行,_www并为您和Apache创建一个组。成立一个新小组,例如,称为trusted,然后将自己_www放入其中。然后,将服务器文档目录中所有文件的组所有者设为可信任。最后,chmod g+rwx仅对Apache需要访问的文件执行必要的操作,以便该trusted组有权编辑文件。
克里斯·米德尔顿

3
只是想再次强调这个答案是一个坏主意。apache进程归其自己的特殊用途用户拥有很多很好的理由。
danyamachine

15

在PHP中使用mkdir时不要将权限设置为777

仅链接答案在StackOverflow上不被视为良好实践,但通常不应遵循此处给出的建议。

我想在一个类似的问题上回复这个好答案。我引用:

请停止使用777的建议。您正在使文件对所有人都可写,这几乎意味着您失去了权限系统所设计的所有安全性。如果您建议这样做,请考虑一下它对配置不当的Web服务器可能造成的后果:通过覆盖文件来“入侵”网站将变得非常容易。所以,不要。


9

修复目录的权限,您尝试创建一个目录


我只是使用Filezilla将文件权限递归更改为755,从而解决了原始问题中的问题。右键单击父文件夹,假设可以设置755权限是通用文件存储库文件夹,然后单击“文件属性”->“数值”->“ 755”,然后选中“递归到子目录”。如果您有很多文件,则需要花费几分钟时间才能在子目录中传播。然后再试一次。
TARKUS '16

7

我知道这个线程很旧,但是也许有一天会帮助某个人。

PHP为什么对mkdir()说“权限被拒绝”的问题-错误的URL路径。因此,要修复它,您所需要的只是获取正确的路径。我这样做是这样的:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>

1
转移到新主机(具有mysqlnd哈哈)时发生在我身上。我忘了更改为新的完整主目录路径。事实证明,这实际上不是权限问题。
JSG

2

您需要具有文件系统权限才能创建目录。

示例:在Ubuntu 10.04中,apache(php)以用户:www-data在组:www-data中运行

意味着用户www-data需要访问权限才能创建目录。

您可以使用以下方法自己尝试:'su www-data'成为www-data用户。

作为快速修复,您可以执行以下操作:sudo chmod 777 my_parent_dir


14
chmod 0777将为世界提供读写访问权限!您不应该建议这样的事情。但是,与用户组的建议是目前最好的方法:)
KingCrunch 2011年

1
如果全世界都可以使用操作系统,那么请确保。更好的方法是:sudo chown www-data:www-data my_parent_dir
Jon Skarpeteig 2011年

或不理会权限,然后将www-data添加到父目录的组。
Marc B

0

您可以做的另一件事是转到:/ etc / sudoers

在那里添加以下行,该行授予该用户www-data的权限ALL =(ALL:ALL)ALL为什么使用www-data?这是因为apache正在使用该用户名运行。

如果您的用户不同,请尝试使用用户名ALL =(ALL:ALL)ALL

这对我有用。


5
不要sudoers直接编辑,而是以root用户身份登录,然后使用te visudo命令:检查所有更改以避免错误的编辑,该错误可能会在加载sudoers文件时导致解析错误,这可能使您无能为力(如无权使用更改任何内容)
Elias Van Ootegem

如何找到用户名。像www-data一样?我正在使用nginx但无法正常工作
robspin '18

1
@robspin尝试一下:ps aux | egrep'(nginx)'
maxwells

0

由于您使用的是Mac,因此可以将自己添加到Mac的_www(apache用户组)组中:

sudo dseditgroup -o edit -a $USER -t user _www

并将_www用户添加到wheel组,这似乎是mac创建文件的方式:

sudo dseditgroup -o edit -a _www -t user wheel

0

我现在遇到了这个问题,我现在可以给您的最好的解决方案是(尽管您没有包含任何代码):

  1. 检查您如何命名目标文件夹,例如:new_folder(有时这可能会导致权限错误,因为大多数主机不允许在运行时创建使用下划线,破折号等的名称)。它为我工作。
  2. 如果您使用递归命令创建子文件夹,请不要忘记将0755(记住在开始时包括0)放在mkdir命令中,例如:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

刚才这对我也有用。


3
777是一个安全问题
MaicolBen

刚编辑到0755
arungisyadi

0

如果您使用的是LINUX,首先让我们检查apache的用户,因为在某些发行版中它可能有所不同:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

假设结果是“ http”。进行以下操作,只记得将path_to_folder更改为文件夹路径:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

检查是否不是umask问题

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}

0

与ftp服务器一起安装后,sudo apt-get install vsftpd必须对其进行配置。要启用写访问权限,您必须编辑/etc/vsftpd.conf文件并取消注释

#write_enable=YES

行,因此应阅读

write_enable=YES

保存文件并重新启动vsftpdsudo service vsftpd restart

有关其他配置选项,请参阅本文档man vsftpd.conf


0

如果使用错误的路径,则会发生此错误。

例如:

我正在使用ubuntu系统,我的项目文件夹名为“ myproject”

假设我有myproject / public / report目录,并且想创建一个名为orders的新文件夹

然后,我需要一个完整的路径来存放我的项目。您可以通过PWD命令获取路径

所以我的根路径将是='/ home / htdocs / myproject /'

$ dir ='/ home / htdocs / myproject / public / report / Orders';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

它将为您工作!请享用 !!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.