在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文件中获取关于上传文件的配置。
我在这里错在哪里?
#1 楼
这是因为images
和tmp_file_upload
只能由root
用户写入。为了使上传正常工作,我们需要使这些文件夹的所有者与httpd进程所有者相同,或使其在全局范围内可写(错误做法)。检查apache进程所有者:
$ps aux | grep httpd
。第一列将是所有者,通常是nobody
将
images
和tmp_file_upload
的所有者更改为nobody
或您在步骤1中找到的任何所有者。<现在,如果需要,所有者可以写Chmod
images
和tmp_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 install
或php 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
评论
775?也许您的服务器没有人运行。在这种情况下,只有root用户可以写(您的“图像”权限)...这是什么意思 ?我该如何更改?
请记住,所有父目录也需要具有正确的权限。