Rocky Linux 9+PHP8.3.12环境下绝对路径引入文件失败求助
多年来我一直通过绝对路径将PHP包含文件放置在网站根目录之外,用于多个系统。但在运行Rocky Linux 9、PHP Version 8.3.12和Apache version 2.4.57的新系统上突然失败。
代码示例
$path = "/home/user/scripts"; // absolute path set_include_path($path); require_once("functions.php");
执行报错
Fatal error: Uncaught Error: Failed opening required '/home/user/scripts/functions.php' (include_path='/home/user/scripts') in /home/user/www/index.php:5 Stack trace: #0 {main} thrown in /home/user/www/index.php on line 5
即使直接使用完整绝对路径:
require_once("/home/user/scripts/functions.php"); // this also fails with same error
仍出现相同错误。脚本目录及文件权限均为755,文件名无误,请问可能是什么原因?
1. SELinux 强制限制(Rocky Linux 9 默认启用)
Rocky Linux 9 默认开启 SELinux 强制模式,Apache 进程的安全上下文(通常为 httpd_t)默认没有权限访问 /home/user 下的自定义目录。
- 临时验证:执行
setenforce 0关闭 SELinux 强制模式,刷新页面测试。若问题解决,即可确认是 SELinux 导致。 - 永久修复:为脚本目录添加 Apache 可访问的 SELinux 上下文:
semanage fcontext -a -t httpd_sys_content_t "/home/user/scripts(/.*)?" restorecon -Rv /home/user/scripts
2. PHP open_basedir 目录限制
PHP 的 open_basedir 配置可能限制了 Apache 进程能访问的目录范围,导致无法读取 /home/user/scripts。
- 检查配置:创建测试文件
phpinfo.php,内容为<?php phpinfo(); ?>,访问后查找open_basedir项,确认是否包含/home/user/scripts。 - 修改配置:若未包含,在 Apache 虚拟主机配置或
php.ini中添加:
重启 Apache 和 PHP-FPM(若使用 FPM 模式)。open_basedir = /home/user/www/:/home/user/scripts/:/tmp/
3. 父目录权限拦截
即使 /home/user/scripts 权限为 755,其上层目录 /home/user 的权限可能不允许 Apache 用户(通常为 apache 或 www-data)进入。
- 检查父目录权限:执行
ls -ld /home/user,确保其他用户有执行权限(权限位最后一位为x,即权限为755或711)。 - 修复权限:若父目录权限不足,执行:
chmod o+x /home/user
4. 文件/目录所有者问题
虽然权限为 755,但如果目录或文件的所有者与 Apache 进程用户不匹配,且权限设置未开放其他用户的读取权限,也会导致访问失败。
- 检查所有者:执行
ls -l /home/user/scripts/functions.php查看文件所有者。 - 调整所有者(可选):若需要,将目录及文件所有者改为 Apache 用户:
chown -R apache:apache /home/user/scripts
内容的提问来源于stack exchange,提问作者phper

