PHP mkdir:权限被拒绝的问题

fol*_*los 91 php

我试图用PHP mkdir函数创建一个目录,但我得到一个错误如下:Warning: mkdir() [function.mkdir]: Permission denied in ....如何解决这个问题?

小智 156

我知道这是一个老线程,但它需要一个更好的答案.您不需要将权限设置为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()函数现在应该可以正常运行而不返回错误

  • [这是一个非常糟糕的主意](http://www.linuxquestions.org/questions/linux-security-4/which-user-should-own-var-www-873287/page2.html#post4316009). (14认同)
  • 我不喜欢那些在没有表现出安全做法的情况下继续说"它不安全"的用户. (4认同)
  • 好答案!希望随着时间的推移,这将成为页面顶部! (2认同)

小智 37

对于将来通过谷歌发现此问题的人的延迟回答.我遇到了同样的问题.

注意:我在MAC OSX狮子会上

会发生什么是apache作为用户"_www"运行,并且没有编辑任何文件的权限.您会注意到没有文件系统功能可以通过php工作.

怎么修:

打开一个finder窗口,从菜单栏中选择Go> Go To Folder>/private/etc/apache2

现在打开httpd.conf

找:

User _www 
Group _www
Run Code Online (Sandbox Code Playgroud)

更改用户名:

User <YOUR LOGIN USERNAME>
Run Code Online (Sandbox Code Playgroud)

现在通过运行此表单终端重启apache:

sudo apachectl -k restart
Run Code Online (Sandbox Code Playgroud)

如果它仍然无法正常工作,我会在执行上述操作之前执行以下操作.可能有关系.

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

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案有效,但如果有人让它执行恶意代码(例如通过Shellshock漏洞利用),Apache可以对您的系统造成严重破坏.另一种方法是让Apache执行为_ _www`并为您和Apache创建一个组.建立一个名为`trusted`的新组,然后将自己和`_www`放在其中.然后让您信任服务器文档目录中所有文件的组所有者.最后,只需要对Apache需要访问的文件执行`chmod g + rwx`,以便`trusted`组有权编辑文件. (6认同)
  • 只是为了重新强调这个答案是一个坏主意.有很多很好的理由,apache进程由他们自己的专用用户拥有. (3认同)

Wil*_*ilt 15

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

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

我想在类似的问题上回复这个伟大的答案.我引用:

请停止建议使用777.您正在使所有人都可以写入您的文件,这几乎意味着您将失去权限系统所设计的所有安全性.如果您建议这样做,请考虑一下配置不当的网络服务器可能带来的后果:通过覆盖文件来"破解"网站会非常容易.所以,不要.


Eri*_*rik 9

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


Bor*_*ris 5

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

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

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
$old = umask(0);

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

?>
Run Code Online (Sandbox Code Playgroud)