You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:27:37