为什么我得到“;“拒绝许可”;在试图重命名目录时使用PHP


Why do I get "permission denied" in PHP when trying to rename a directory?

我将目录修改为777,与目录内容相同。尽管如此,我还是得到了一个"拒绝权限"的错误。如果apache不是组/所有者,不管文件权限如何,PHP是否会抛出此错误?这是一个失败的电话:

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

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

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

要澄清的是,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'); 

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

尝试运行以下脚本:

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

看看结果如何。

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

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

然后您可以毫无问题地执行chown语句。

经过几个小时的研究和测试,我找到了这种方法。

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

向致以最良好的问候