尝试在 CentOS 上使用 Apache 2.2 和 PHP 5.3 配置上传目录时,我不断收到此错误。
在 php.ini 中:
upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/
在 httpd.conf 中:
Directory /var/www/html/mysite/tmp_file_upload/>
Options -Indexes
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
Options -Indexes
</Directory>
CentOS 目录权限:
drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload
无论我做什么,当我上传文件时,我都会从 PHP 收到这个错误:
警告:move_uploaded_file(images/robot.jpg):无法打开流:第 78 行 /var/www/html/mysite/process.php 中的权限被拒绝警告:move_uploaded_file():无法将“/tmp/phpsKD2Qm”移动到第 78 行 /var/www/html/mysite/process.php 中的“images/robot.jpg”
如您所见,它从未从 php.ini 文件中获取有关上传文件的配置。
我在这里做错了什么?
这是因为 images
和 tmp_file_upload
只能由 root
用户写入。为了上传工作,我们需要使这些文件夹的所有者与 httpd 进程所有者相同,或者使它们全局可写(不好的做法)。
检查 apache 进程所有者:$ps aux | grep httpd。第一列将是所有者,通常是 nobody 将图像的所有者和 tmp_file_upload 更改为 none 或您在步骤 1 中找到的任何所有者。 $sudo chown nobody /var/www/html/mysite/images/ $sudo chown nobody /var/www/html/mysite/tmp_file_upload/ chmod images 和 tmp_file_upload 现在可以由所有者写入,如果需要的话[似乎你已经有了这个]。在@Dmitry Teplyakov 的回答中提到。 $ sudo chmod -R 0755 /var/www/html/mysite/images/ $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/ 有关此行为发生原因的更多详细信息,请查看手册 http://php .net/manual/en/ini.core.php#ini.upload-tmp-dir ,注意它也谈论 open_basedir 指令。
您还可以运行此脚本来找出 Apache 进程所有者:
<?php echo exec('whoami'); ?>
然后将目标目录的所有者更改为您所拥有的。使用命令:
chown user destination_dir
然后使用命令
chmod 755 destination_dir
更改目标目录权限。
<?php echo exec('whoami'); ?>
。有谁知道为什么?
exec('whoami')
加 1。又为我节省了 30 分钟。正在吃 ubuntu 用户
www-data
吗? 通常
这对我有用。
sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www
然后注销或重新启动。
如果 SELinux
抱怨,请尝试以下操作
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'
如果您有 Mac OS X,请转到文件根目录或您网站的文件夹。
然后右键单击它,获取信息,转到最底部(共享和权限),打开它,将所有只读更改为可读写。确保打开挂锁,转到设置图标,然后选择应用到随附的项目...
/private/var/tmp
中的书写选项后,它对我有用。
我想将此添加到以前的建议中。如果您使用的是启用了 SELinux 的 Linux 版本,那么您还应该在 shell 中执行此操作:
chcon -R --type httpd_sys_rw_content_t /path/to/your/directory
除了通过组或更改目录所有者来授予您的 Web 服务器用户权限。
restorecon -R -v /path/to/your/directory
之后可能还需要包含在其中。 access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
更改此文件夹的权限
# chmod -R 0755 /var/www/html/mysite/images/
尝试这个:
打开 /etc/apache2/envvars sudo gedit /etc/apache2/envvars 将 www-data 替换为 your_username “export APACHE_RUN_USER=www-data” 替换为 export APACHE_RUN_USER='your_username'
$ sudo service apache2 restart
) 以查看 <?php echo exec('whoami'); ?>
中的效果
即使已经成功运行作曲家,我也遇到了这个相关的问题。我更新了作曲家,在运行 composer install
或 php composer.phar install
时,我得到了:
...无法打开流:权限被拒绝...
经过大量研究后发现,先前有关更改文件夹权限的答案有效。它们现在只是稍微不同的目录。
在我的安装中,在 OS X 上,缓存文件位于 /Users/[USER]/.composer/cache
中,我遇到了问题,因为缓存文件归 root 所有。以递归方式将“.composer”的所有权更改给我的用户解决了这个问题。
这就是我所做的:
sudo chown -R [USER] cache
然后我再次运行作曲家安装,瞧!
当 apache 用户(www-data)没有写入文件夹的权限时,就会出现此问题。要解决此问题,您需要将用户放入组 www-data。
我刚做了这个:
执行此 php 代码 <?php echo exec('whoami'); ?>
以发现 apache 使用的用户。之后,在终端中执行命令:
user@machine:/# cd /var/www/html
user@machine:/var/www/html# ls -l
它将返回如下内容:
total of files
drwxr-xr-x 7 user group size date folder
我保留了用户,但将组更改为 www-data
chown -R user:www-data yourprojectfoldername
chmod 775 yourprojectfoldername
解决方案非常简单。只需右键单击IMAGE(目标)文件夹,转到属性,单击权限选项卡,然后将其他访问权限更改为创建和删除文件。
只需将 tmp_file_upload 的权限更改为 755 以下是命令 chmod -R 755 tmp_file_upload
尝试这个
find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664
如果启用 SELinux
,就会发生这种情况。通过设置 SELINUX=disabled
在 /etc/selinux/config
中禁用它并重新启动服务器。
我已经尝试了上述所有解决方案,但以下解决了我的问题
chcon -R -t httpd_sys_rw_content_t your_file_directory
jacob
所有(因为它是我的本地计算机),并且文件夹都有755
或775
。sudo service httpd restart
。然后它起作用了 :) 我没有更改所有者chown
,而是将我的 apache 进程添加到“www”组,并通过chgrp
将这些目录添加到同一个“www”组