尝试在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'移动到'images /在第78行的/var/www/html/mysite/process.php中的robot.jpg'

如您所见,它从未从php.ini文件中获取关于上传文件的配置。
我在这里错在哪里?

评论

775?也许您的服务器没有人运行。在这种情况下,只有root用户可以写(您的“图像”权限)...

这是什么意思 ?我该如何更改?

请记住,所有父目录也需要具有正确的权限。

#1 楼

这是因为imagestmp_file_upload只能由root用户写入。为了使上传正常工作,我们需要使这些文件夹的所有者与httpd进程所有者相同,或使其在全局范围内可写(错误做法)。


检查apache进程所有者:$ps aux | grep httpd。第一列将是所有者,通常是nobody


imagestmp_file_upload的所有者更改为nobody或您在步骤1中找到的任何所有者。
<现在,如果需要,所有者可以写Chmod imagestmp_file_upload [似乎您已经安装了它]。在@Dmitry Teplyakov答案中提及。

$sudo chown nobody /var/www/html/mysite/images/

$sudo chown nobody /var/www/html/mysite/tmp_file_upload/


有关为什么发生此行为的更多详细信息,请查看手册http://php.net/manual/en/ini.core .php#ini.upload-tmp-dir,请注意,它也讨论了open_basedir指令。


评论


谢谢:我们的老主人曾经是守护进程,现在是apache

– zz子
13年6月18日在14:48

此修复适用于您可能将服务器php类型从fast_CGI,CGI更改为Apache_mod(如plesk等)的情况。可以继续使用原始用户的权限而不是Apache。这解决了我的问题。

– elliotrock
14-10-16在4:31

我遇到了同样的错误,但是进程和文件夹都归jacob所有(我是我的本地计算机),并且文件夹都具有755或775。

–石灰和椰子
2015年2月8日在19:00

更改权限后,我不得不重新启动apache进程sudo服务httpd重新启动。然后它起作用了:)我没有更改所有者chown,而是将我的apache进程添加到了“ www”组,并通过chgrp将这些目录添加到了相同的“ www”组中

–阿里·赛义德(Ali Saeed)
2015年4月9日15:27



#2 楼

您还可以运行以下脚本来查找Apache进程的所有者:

<?php echo exec('whoami'); ?>

,然后将目标目录的所有者更改为所拥有的目录。使用命令:

chown user destination_dir


,然后使用命令

chmod 755 destination_dir


更改目标目录权限。

评论


谢谢,对我有用。我首先使用了Laith Shadeed的方法,但键入ps aux |时却无法得到相同的结果。 grep httpd和<?php echo exec('whoami'); ?>。有人知道为什么吗?

– Kukinsula
2014年6月17日下午16:17

ps aux | grep https不返回Web服务器所有者名称。这是:ps aux | grep -E'[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx'| grep -v根|头-1 |剪切-d \ -f1 Fron Symfony文档。

– David Jacquel
14年7月22日在10:54

注意,在上面的命令中,“-d \”和“ -f1”之间应该有两个空格。如果按原样复制粘贴,则可能会出现类似“ cut:bad delimiter”的错误。

–Beejor
2015年4月5日在0:07



加上exec('whoami')的1。为我节省了30分钟。正在向ubuntu用户扔钱

–德瓦尔·坎德尔瓦尔(Deval Khandelwal)
15年4月14日在17:45

这应该是www-data吗?通常

– maxisme
2015年4月27日15:45



#3 楼

如果您使用的是Mac OS X,请转到文件根目录或网站的文件夹。

然后右键单击它,转到以获取信息,然后转到最底部(共享和权限) ,将其打开,将所有只读更改为读写。确保打开挂锁,转到设置图标,然后选择“应用于随附的项目...

评论


当他的问题与Linux系统有关时,为什么要在Mac OS上发表评论?

– Kmeixner
16 Mar 15 '16 at 20:11

嗨,霍卡,谢谢您的回复。我在Mac上,您的回答解决了我的问题。非常感谢。

– Sanjay Sharma
16-09-28在7:30

喜欢这个答案

– Alexey Sh。
17年12月29日在18:22

@Kmeixner这个关于Linux的问题,但是我在OSX上却完全一样。感谢您的评论,在我更改Mac上/ private / var / tmp文件夹中的写入选项后,它对我有用。

–萨拉姆
18年5月2日在14:37

这是一篇较旧的文章,但这正是我需要做的。谢谢

–TheRobQ
18年9月4日在22:35

#4 楼

这对我有用。

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(/.*)?'


评论


挽救了我的生命:) ..我使用GIT接收后钩子部署我的Web,每次我部署时都会得到他的权限被拒绝错误,将git用户添加到固定的www-data中:)谢谢

–萨拉博扎
17年8月8日在7:49

这是最好的答案。

–saviour123
17年11月8日在16:19

#5 楼

我想将此添加到以前的建议中。如果使用的是启用了SELinux的Linux版本,则还应该在shell中执行此操作:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory


通过组授予Web服务器用户权限或更改目录的所有者。

评论


之后可能还需要将restorecon -R -v / path / to / your /目录包括在内。 access.redhat.com/documentation/zh-CN/Red_Hat_Enterprise_Linux/…

–绝对ƵERØ
17年7月9日在23:08

也许非常正确,但是我假设chcon是“更改上下文”,即它刚刚被更改。您正在查看的内容首先使用“ semanage fcontext”,它将其放入某些设置文件“ file_contexts.local”中,但是它永远不会更改上下文。

–克里斯
17年9月6日在12:41

@克里斯,谢谢你。这解决了我的问题。您能说明一下这件事吗?该命令实际上是做什么的?我浏览了手册页,甚至是chcon的信息,都没有找到您输入的类型的值。我在这里有点困惑。

–小丑
19年6月9日在16:45

它使目录或文件可被Web服务器(httpd)读取...老实说,我不想也可能无法解释selinux,因为我本人对此几乎一无所知...请参阅nsa.gov/what-we-do / research / selinux / documentation和access.redhat.com/documentation/en-us/red_hat_enterprise_linux/…

–克里斯
19年6月17日在9:25



#6 楼

更改此文件夹的权限

# chmod -R 0755 /var/www/html/mysite/images/

评论


现在是否像:drwxrwxr-x 2 root root 4096 Nov 11 10:01 Images on:drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload但仍然是相同的错误

–user63898
2011年11月12日,11:15

#7 楼

试试这个:



打开/ etc / apache2 / envvars

sudo gedit /etc/apache2/envvars



www-data替换您的your_username

"export APACHE_RUN_USER=www-data" 


替换为

export APACHE_RUN_USER='your_username' 




#8 楼

即使已经成功运行composer,我也遇到了这个相关问题。我更新了作曲家,并在运行composer installphp composer.phar install时得到:


...无法打开流:权限被拒绝...


经过大量研究,结果表明,先前有关更改文件夹权限的答案有效。它们现在只是稍微不同的目录。

在我的安装中,在OS X上,高速缓存文件位于/Users/[USER]/.composer/cache中,由于高速缓存文件由root拥有,因此我遇到了麻烦。递归地向用户更改'.composer'的所有权即可解决此问题。

这就是我所做的:

sudo chown -R [USER] cache


然后我运行了重新安装作曲家,瞧!

#9 楼

当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


#10 楼

解决方案是如此简单。仅右键单击IMAGE(目标)文件夹,转到属性,单击权限选项卡,然后将其他访问权限更改为创建和删除文件。

评论


但是最快的方法,只有您使用GUI进行FTP传输(FileZilla,WinSCP)

– CLOUGH
18年8月20日在17:02

#11 楼

只需将tmp_file_upload的权限更改为755
,以下是命令
chmod -R 755 tmp_file_upload

#12 楼

试试这个

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664

评论


得到:chmod:`664'之后缺少操作数

–user63898
2011年11月12日上午11:16

#13 楼

如果启用了SELinux,则会发生这种情况。通过设置/etc/selinux/config禁用SELINUX=disabled中的功能,然后重新启动服务器。

#14 楼

我已经尝试了以上所有解决方案,但是以下解决了我的问题
chcon -R -t httpd_sys_rw_content_t your_file_directory