【问题标题】:PHP: unable to move file to different folderPHP:无法将文件移动到不同的文件夹
【发布时间】:2017-09-29 00:28:50
【问题描述】:

我正在尝试将使用 PHP 上传的文件移动到不同的文件夹,但不知何故这不起作用,导致:

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

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

我已经为/var/www/html/upload/tmp 设置了777 和所有者root:root 的权限,以确保绝对不会有问题。
但这并没有解决它...

我尝试过的其他事情:

  • 将所有者设置为apache:apache
  • 将源文件权限更改为777 和所有者root(默认情况下,所有者设置为apache
  • 检查 PHP 设置(几乎是默认设置,/var/www/html/tmpopen_basedir 内部,upload_tmp_dir 未设置)+ 日志
  • 检查 Apache 设置 + 日志
  • 在同一个文件夹中移动文件 --> 可行!
  • 将其移至其他文件夹 --> 不起作用
  • 将所有父目录设置为777 和所有者rootapache

我创建了一个测试脚本:

<?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());

它给出如下输出:

测试文件移动

/var/www/html

/var/www/html/upload/tmp

数组([类型] => 2 [消息] => 重命名(/tmp/tst.txt,tst-2.txt): 权限被拒绝 [file] => /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/。也许有一些原因它不能将文件移到这个目录之外?虽然我找不到任何东西......

我希望有人可以为我提供线索,了解可能发生的事情!

【问题讨论】:

    标签: php apache centos7 php-7.1 fpm


    【解决方案1】:

    将目录或网络服务器的所有者更改为 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

    【讨论】:

    • www-data 在 CentOS 上不存在,它在那里被称为 apache,但是使用 apache 而不是 www-data 执行这些命令并不能解决它...
    【解决方案2】:

    原来是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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-07-11
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-12
        • 1970-01-01
        • 2020-01-13
        相关资源
        最近更新 更多