PHP scandir()提示权限拒绝但Apache已拥有目录权限问题
问题排查方案
针对你遇到的scandir()权限拒绝问题,尽管目录权限显示正常,可按以下方向逐一排查:
1. SELinux 强制访问控制限制
这是最常见的“权限显示正常但访问被拒”原因,临时关闭SELinux测试:
setenforce 0
若关闭后问题消失,说明是SELinux上下文标签错误,修复命令:
# 临时修复上下文 chcon -R -t httpd_sys_content_t /var/www/html/mike/DroughtAgg/ # 永久生效(需安装policycoreutils-python包) semanage fcontext -a -t httpd_sys_content_t "/var/www/html/mike/DroughtAgg(/.*)?" restorecon -R /var/www/html/mike/DroughtAgg/
2. 确认PHP实际运行用户
PHP的运行用户不一定是apache(比如php-fpm常使用www-data或自定义用户),在ddashboard.php中添加代码查看当前运行用户:
echo exec('whoami');
若输出用户不是apache,需将该用户加入domain users组,或调整目录权限让其拥有访问权限:
usermod -aG domain_users [php运行用户]
3. 检查父目录权限链
目录访问需要每一级父目录的执行权限(x),用以下命令检查所有父目录权限:
ls -ld /var /var/www /var/www/html /var/www/html/mike
确保PHP运行用户对每一级目录都有x权限,否则即使子目录权限全开也无法访问。
4. 文件系统挂载限制
若DroughtAgg所在分区是挂载的,检查挂载参数是否包含noexec等限制:
mount | grep /var/www/html/mike/DroughtAgg
若存在noexec,修改/etc/fstab中的挂载选项后重新挂载。
5. PHP open_basedir 限制
检查PHP配置中的open_basedir是否限制了访问目录范围,在代码中添加:
echo ini_get('open_basedir');
若/var/www/html/mike/DroughtAgg不在允许列表内,修改php.ini或.htaccess(若允许):
# .htaccess 示例 php_value open_basedir "/var/www/html/mike:/path/to/other/allowed/dirs"
内容的提问来源于stack exchange,提问作者ratbiscuit225
相关产品推荐
相关产品推荐

