CentOS 7服务器httpd写入/home目录权限拒绝问题求助
看起来你已经尝试了不少常规方案,但问题依然存在——毕竟php -a下用test用户能正常执行move_uploaded_file(),说明核心函数没问题,问题肯定出在Apache运行时的环境限制上。咱们从几个容易被忽略的点逐一排查:
1. 确认Apache实际运行的用户/组
有时候修改了httpd.conf里的User和Group但没重启服务,或者存在其他配置文件(比如/etc/httpd/conf.d/下的自定义配置)覆盖了默认设置。执行以下命令验证:
ps aux | grep httpd
看看输出里httpd进程的运行用户是不是你设置的test,如果不是,先重启httpd服务:
systemctl restart httpd
另外,检查是否启用了suexec模块(这个模块会限制用户切换):
httpd -M | grep suexec
如果输出suexec_module (shared),那可能需要调整suexec的配置,或者暂时禁用该模块测试。
2. 检查/home目录的权限链
即使你给目标子目录设置了全权限,如果/home本身的权限不让Apache用户进入,也会报错。执行命令查看/home的权限:
ls -ld /home
正常来说,/home的权限应该是drwxr-xr-x(755)或者至少drwx--x--x(711),确保其他用户有执行权限(允许进入目录)。如果是drwx------(700),那Apache用户根本没法进入/home目录,更别说写入子目录了,修改权限:
chmod 711 /home
3. 检查SELinux的布尔值设置
你已经修改了目录的SELinux上下文,但可能还有布尔值限制Apache访问用户家目录。执行命令查看相关布尔值:
getsebool -a | grep httpd_enable_homedirs
如果输出是httpd_enable_homedirs --> off,那就开启这个布尔值(加-P永久生效):
setsebool -P httpd_enable_homedirs on
另外,还有httpd_can_write_home布尔值也可能影响,一并检查开启:
setsebool -P httpd_can_write_home on
4. 排查PHP的open_basedir限制
PHP的open_basedir配置会限制PHP脚本只能访问指定目录,即使Apache有权限,PHP也会阻止写入。检查php.ini中的配置:
grep open_basedir /etc/php.ini
如果输出包含路径但没有你要写入的/home下的目录,要么把目标目录添加进去,要么暂时注释掉该配置(仅测试用,生产环境要谨慎),然后重启httpd服务。
5. 检查文件系统的ACL权限
有时候常规的所有者/组权限不够,文件系统的ACL权限可能额外限制了访问。用以下命令查看目标目录的ACL设置:
getfacl /home/your-target-directory
如果没有给Apache用户(或httpd组)分配权限,添加读写执行权限:
setfacl -m u:apache:rwx /home/your-target-directory # 如果你改成了test用户运行httpd,就替换成u:test:rwx
6. 确认move_uploaded_file的目标路径
最后,再仔细检查代码里的目标路径是不是正确的:
- 是不是用了绝对路径?如果是相对路径,PHP的工作目录可能是Apache的默认根目录(比如
/var/www/html),这时候相对路径指向的不是/home下的目录。 - 路径里有没有拼写错误,比如大小写(Linux是区分大小写的)?
按照这个顺序排查,应该能找到问题所在——毕竟你已经排除了常规的SELinux上下文和所有者问题,大概率是权限链、SELinux布尔值或者PHP配置的锅。
内容的提问来源于stack exchange,提问作者ccmorataya

