PHP读取public_html目录外文件权限不足的解决方法
PHP访问public_html目录外文件的权限配置方案
首先修正你代码里的显性逻辑错误:你将file_get_contents()的返回值赋值给了$fileHandle,但后续判断分支使用了未定义的$result变量,会直接导致逻辑判断失效,先修正变量引用问题后再排查权限。
权限报错的核心原因是PHP运行进程的系统用户,对目标文件及其所有父级目录没有对应访问权限,按以下步骤配置即可,严禁直接给文件设置777权限,会引发严重的服务器安全漏洞:
确认PHP进程的运行用户
不同SAPI运行模式下PHP的所属用户不同,执行以下命令可直接查询:ps aux | grep -E '(php-fpm|apache|nginx)' | grep -v grep输出第一列的用户名就是PHP的运行身份,Debian/Ubuntu系统默认一般为
www-data,CentOS/RHEL系统默认一般为apache。配置目录与文件的系统权限
目标文件的所有父级目录必须拥有可执行权限(即目录遍历权限),目标文件本身需要拥有可读权限,执行以下命令配置即可(将示例中的www-data替换为你实际查询到的PHP运行用户):# 确认目标文件父目录的遍历权限,默认/var目录权限一般符合要求,重点校验/var/www目录 chmod 755 /var/www # 将目标文件的属组设置为PHP运行用户 chgrp www-data /var/www/new.txt # 设置文件权限:属主可读写,属组可读,其余用户无任何权限 chmod 640 /var/www/new.txt如果需要让PHP访问/var/www下的多个私有文件,可递归调整对应目录的属组:
chgrp -R www-data /var/www/your_private_storage_dir排查额外的访问拦截规则
- SELinux拦截(CentOS/RHEL系列发行版默认开启)
若服务器开启了SELinux,即使文件权限配置正确也会被拦截,执行以下命令放行:# 允许Web服务读取站点目录外的指定文件 setsebool -P httpd_read_user_content 1 # 给目标文件打上Web服务可读的SELinux上下文标签 chcon -R -t httpd_sys_content_t /var/www/new.txt - open_basedir目录限制
如果PHP配置了open_basedir跨目录访问限制,需要将目标路径加入允许列表,在php.ini、PHP-FPM池配置或站点虚拟主机配置中修改对应参数:open_basedir = /home/your_site/public_html:/tmp:/var/www
- SELinux拦截(CentOS/RHEL系列发行版默认开启)
所有配置修改完成后,重启对应的PHP服务、Web服务(Nginx/Apache)即可生效。
内容的提问来源于stack exchange,提问作者peer
相关产品推荐
相关产品推荐

