我正在尝试将使用PHP上传的文件移动到其他文件夹,但不知怎的,这将无法正常工作,从而导致:
move_uploaded_file(upload/tmp/phpxEGMLG): failed to open stream: Permission denied
所以,显然我没有 upload/tmp
(实际上是 /var/www/html/upload/tmp
)的适当权限 .
我已经为 777
设置了权限,为 /var/www/html/upload/tmp
设置了所有者 root:root
,以确保无法解决问题 .
但那并没有解决它......
我试过的其他事情:
-
将所有者设为
apache:apache
-
将源文件权限更改为
777
和所有者root
(默认情况下,所有者设置为apache
) -
检查PHP设置(几乎默认,
/var/www/html
和/tmp
在open_basedir
内,upload_tmp_dir
未设置)日志 -
检查Apache设置日志
-
在同一文件夹中移动文件 - >这有效!
-
将其移动到另一个其他文件夹 - >不起作用
-
将所有父目录设置为
777
和所有者root
或apache
我创建了一个测试脚本:
<?php
echo 'TESTING FILE MOVE' . '<br><br>';
echo getcwd() . '<br>';
echo get_current_user() . '<br>';
error_reporting(E_ALL);
file_put_contents('/tmp/tst.txt', 'this is a test');
chdir('/var/www/html/upload/tmp');
echo getcwd() . '<br><br>';
rename('/tmp/tst.txt', 'tst-2.txt');
print_r(error_get_last());
它给出了如下输出:
TESTING FILE MOVE / var / www / html root / var / www / html / upload / tmp Array([type] => 2 [message] => rename(/tmp/tst.txt,tst-2.txt):权限被拒[文件] => /var/www/html/test.php [line] => 13)
这告诉我脚本在哪个用户下运行,我在正确的目录中 . 它还省略了 move_uploaded_file
使用的额外检查,重点是移动文件 .
有关我的设置的一些信息:
-
CentOS 7
-
PHP 7.1
-
PHP-FPM
-
Apache 2.4.6
它为PHP-FPM使用单独的临时目录,如 /tmp/systemd-private-xxxx-php71-php-fpm.service-yyyy/tmp/
. 也许有一些原因它无法将文件移到此目录之外?虽然我找不到任何东西......
我希望有人可以告诉我可能发生的事情!
3 回答
将目录或webser的所有者更改为
www-data
并将自己添加到www-data
group,注销或重新启动 .chown help和chmod help
在[Service]下将PrivateTmp设置为false(可能您必须在/ etc / systemd / system中创建名为httpd.service的单元文件) . 请告诉我们
事实证明是 SELinux .
或多或少同样的问题在这里回答:https://unix.stackexchange.com/questions/50639/httpd-cant-write-to-folder-file-because-of-selinux
我确实让SELinux的webserver文件夹设置为Apache可用,同时也允许FTP读/写 . 但是我需要设置
upload
文件夹(以及它下面的文件夹)以允许Apache进行读/写,这可以通过类似的方式完成(注意命令中的rw
位):另外,一个方便的命令检查:
现在显示: