Fedora35下PHP+Apache报Failed to open stream权限拒绝错误
PHP访问ini文件报Permission denied的解决方案
报错核心是Apache运行的PHP进程没有目标配置文件的读取权限,你之前的权限配置没覆盖全链路,按以下步骤逐一排查修复:
- 校验全路径遍历权限
Linux系统下访问文件需要从根目录开始的每一级父目录都对访问用户开放执行(x)权限,任意一级缺权限都会报拒绝访问,不要只给/agrotermos单目录加权限,执行以下命令一键检查全路径权限:
检查输出中每一级路径的权限位:namei -l /agrotermos/conf/conf.ini/、/agrotermos、/agrotermos/conf这三级目录,需要对Apache运行用户开放x权限/agrotermos/conf/conf.ini文件本身,需要对Apache运行用户开放r权限
哪一级权限不足就单独补,参考命令:
# 补目录执行权限 chmod o+x /agrotermos chmod o+x /agrotermos/conf # 补配置文件读权限 chmod o+r /agrotermos/conf/conf.ini - 排查SELinux拦截(CentOS/RHEL/Rocky/Fedora系系统高发)
这类发行版默认开启SELinux安全模块,即使文件权限配置正确,Apache进程默认也无权读取/var/www/html站点目录外的文件,先执行以下命令临时关闭SELinux验证:
刷新页面如果报错消失,即可确认是SELinux拦截,不要长期关闭SELinux,执行以下命令给目标目录配置合规的安全上下文即可:setenforce 0
配置完成后重新开启SELinux:semanage fcontext -a -t httpd_sys_content_t "/agrotermos(/.*)?" restorecon -Rv /agrotermossetenforce 1 - 校验PHP open_basedir限制
如果你的PHP开启了open_basedir安全限制,PHP会被禁止访问配置列表外的路径,按以下步骤调整:- 新建phpinfo页面,查看
Loaded Configuration File项找到当前加载的php.ini路径 - 编辑php.ini,找到
open_basedir配置项,将ini文件所在路径追加到允许列表,示例:open_basedir = /var/www/html/:/agrotermos/conf/ - 重启Apache服务生效:
# RHEL/CentOS系执行 systemctl restart httpd # Debian/Ubuntu系执行 systemctl restart apache2
- 新建phpinfo页面,查看
- 校验文件所属配置
注意不同发行版Apache运行用户不同:RHEL/CentOS系为apache,Debian/Ubuntu系为www-data,不要改错用户。执行对应命令递归设置目录所属:# RHEL/CentOS系执行 chown -R apache:apache /agrotermos # Debian/Ubuntu系执行 chown -R www-data:www-data /agrotermos
验证技巧:可以在
conndb.php中加入echo shell_exec('whoami');,访问页面确认PHP实际运行用户,避免给错误的用户配置权限。
内容的提问来源于stack exchange,提问作者Isabella Breder
相关产品推荐
相关产品推荐

