PHP:无法将文件移动到其他文件夹

时间:2017-05-01 15:28:35

标签: php apache centos7 php-7.1 fpm

我试图将使用PHP上传的文件移动到其他文件夹,但不知怎的,这不起作用,导致:

move_uploaded_file(upload/tmp/phpxEGMLG): failed to open stream: Permission denied

所以,显然我没有upload/tmp的适当权限(实际上是/var/www/html/upload/tmp)。

我已为[{1}}设置777和所有者root:root的权限,以确保无法解决问题。
但那并没有解决它......

我尝试过的其他事情:

  • 将所有者设为/var/www/html/upload/tmp
  • 将源文件权限更改为apache:apache和所有者777(默认情况下,所有者设置为root
  • 检查PHP设置(非常默认,apache/var/www/html位于/tmp内,open_basedir未设置)+日志
  • 检查Apache设置+日志
  • 在同一文件夹中移动文件 - >这很有效!
  • 将其移至其他不同的文件夹 - >没有工作
  • 将所有父目录设置为upload_tmp_dir和所有者777root

我创建了一个测试脚本:

apache

它输出如下:

  

测试文件移动

     

的/ var / www / html等
  根
  /无功/网络/ HTML /上传/ TMP

     

数组([type] => 2 [message] =>重命名(/tmp/tst.txt,tst-2.txt):   权限被拒绝[file] => /var/www/html/test.php [line] => 13)

这告诉我脚本在哪个用户下运行,我在正确的目录中。它还省略了<?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()); 使用的额外检查,重点是移动文件。

有关我的设置的一些信息:

  • CentOS 7
  • PHP 7.1
  • PHP-FPM
  • Apache 2.4.6

它为PHP-FPM使用单独的临时目录,如move_uploaded_file。也许有一些原因它无法将文件移到此目录之外?我虽然找不到任何东西......

我希望有人可以向我提供可能发生的事情的线索!

3 个答案:

答案 0 :(得分:0)

将目录或webser的所有者更改为www-data并将自己添加到www-data组,注销或重新启动。

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

chown helpchmod help

答案 1 :(得分:0)

结果是 SELinux

这里回答的问题大致相同:https://unix.stackexchange.com/questions/50639/httpd-cant-write-to-folder-file-because-of-selinux

我确实已经将SELinux的Web服务器文件夹设置为Apache可用,同时还允许FTP读/写。但我需要设置upload文件夹(及其下面的文件夹)以允许Apache进行读/写,这可以通过类似的方式完成(注意命令中的rw位):

chcon --user system_u --type httpd_sys_rw_content_t -R upload

此外,还有一个方便的检查命令:

ls -Z

现在显示:

drwxr-xr-x. apache  apache  system_u:object_r:httpd_sys_rw_content_t:s0 upload

答案 2 :(得分:0)

在[服务]下将PrivateTmp设置为false(可能必须在/ etc / systemd / system中创建一个名为httpd.service的单元文件)。请让我们知道