禁用SELinux后PHP仍无法上传文件至/var/www/html外目录
针对你遇到的move_uploaded_file权限拒绝错误,结合你提供的信息(SELinux已禁用),可以按以下步骤排查解决:
1. 检查父目录/home/user的访问权限
uploads目录的权限虽然设置了drwxrwxr-x(apache组有读写执行权限),但如果其父目录/home/user没有给apache用户/组提供读取和进入权限,httpd进程依然无法访问到uploads目录。
执行命令查看/home/user的权限:
ls -ld /home/user
确保该目录的权限至少包含r-x(读取+进入)权限给apache用户或其所在组。比如:
- 如果/home/user的属组是apache,权限设为
drwxr-x---即可 - 如果是其他情况,可调整为
drwxr-xr-x(不推荐长期使用,建议优先用属组控制)
调整权限的命令示例:
chmod g+rwx /home/user # 若/home/user的属组是apache # 或者 chmod o+rx /home/user # 临时开放其他用户的读取进入权限,仅用于测试
2. 检查PHP的open_basedir限制
PHP的open_basedir配置会限制脚本能访问的文件系统路径,如果/home/user/uploads不在允许列表内,会直接触发权限拒绝错误。
查看当前生效的open_basedir设置:
php -i | grep open_basedir
如果输出中有路径限制,需要修改php.ini(通常在/etc/php.ini或/etc/php.d/下的配置文件),将/home/user/uploads添加到open_basedir的允许路径中,例如:
open_basedir = /var/www/html:/home/user/uploads
修改后重启httpd服务:
systemctl restart httpd
3. 确认httpd的运行用户
RHEL中httpd默认以apache用户运行,但如果你的环境有自定义配置,需确认实际运行用户:
ps aux | grep httpd | grep -v grep
如果运行用户不是apache,则当前uploads目录的属组权限(apache组)无法生效。此时可以:
- 将运行用户添加到apache组:
usermod -aG apache [运行用户名],然后重启httpd - 或者修改uploads目录的属主为运行用户:
chown -R [运行用户名]:apache /home/user/uploads
4. 临时测试权限(仅用于排查)
如果以上步骤无法快速定位,可临时开放uploads目录的全局写入权限进行测试:
chmod o+w /home/user/uploads
若上传成功,说明问题出在用户/组权限配置上,再调整回安全的权限设置(比如去掉全局写入,保留apache组的权限)。
内容的提问来源于stack exchange,提问作者Tahmidur Rahman

