【问题标题】:Why do I get "permission denied" in PHP when trying to rename a directory?为什么我在尝试重命名目录时在 PHP 中得到“权限被拒绝”?
【发布时间】:2010-09-16 19:16:29
【问题描述】:

我将目录修改为 777,与目录内容相同。不过,我收到“权限被拒绝”错误。如果 apache 不是组/所有者,无论文件权限如何,PHP 是否会抛出此错误?这是失败的调用:

rename('/correct/path/to/dir/1', '/correct/path/to/dir/2');

【问题讨论】:

    标签: php permissions rename


    【解决方案1】:

    您正在编辑更高级别的目录,因此 PHP 用户需要对该目录具有写入权限。

    【讨论】:

      【解决方案2】:

      那可能是因为 apache 不是父目录的所有者。重命名(或移动)文件与创建新文件基本相同。

      【讨论】:

        【解决方案3】:

        澄清一下,php 只能重命名它拥有实际所有权的目录:

        -rwxrwxrwx user   user   temp/
        -rwxr-xr-x apache apache temp2/
        -rw-r--r-- user   user   script.php
        

        假设 script.php 正在尝试重命名这两个目录:

        // this operation fails as PHP (running as apache) does not own "temp",
        // despite having write permissions    
        rename('temp', 'temp.bak');
        
        // this operation is successful as PHP owns "temp2"
        rename('temp2, 'temp.bak'); 
        

        【讨论】:

        • 在安全模式下为真,但在所有其他情况下不需要所有权 - 具有适当权限的简单 chmod 就足够了。
        【解决方案4】:

        另一件可能有助于这些情况的事情是尝试实际降低权限。我见过 apache 拒绝应用程序执行某项操作的情况,因为它的权限设置得太高。我的猜测是,这是为了鼓励良好的安全实践。

        【讨论】:

          【解决方案5】:

          尝试运行以下脚本:

          print_r(posix_getpwuid(getmyuid()));
          print_r(pathinfo($YOUR_PATH));
          

          看看会返回什么。

          【讨论】:

            【解决方案6】:

            您必须递归地更改文件夹和其中包含的文件的权限。 您需要以 root 用户身份从 ssh 执行此操作,然后运行以下命令:

            chown -R www-data:www-data /directory/path/to/apply/chown
            

            那么你就可以毫无问题地执行 chown 语句了。

            我在研究,测试了几个小时后发现了这种方式。

            请记住,文件夹或 root 所有者文件不能被其他用户操作(删除、重命名、移动、更改属性),而 root 可以在任何用户之上执行此操作。

            最好的问候

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-24
              • 2017-03-27
              • 2021-04-09
              • 1970-01-01
              • 2012-07-31
              • 1970-01-01
              • 2016-01-23
              • 1970-01-01
              相关资源
              最近更新 更多