跟着做完这几步,你就能搞清楚小皮面板上传失败的权限原因,并把站点目录权限调到既能正常上传、又不至于全站 777 的状态。
第一步:先确认报错是不是权限引起的
这一步要做的是排除干扰项,确认问题真的出在权限上。常见现象有三种:PHP 报 move_uploaded_file(): failed to open stream: Permission denied;上传进度条走完但文件没出现;或者直接 500、502。
到小皮面板左侧「网站」→ 找到对应站点 →「管理」→「设置」→「网站日志」,看错误日志里最后几行。如果日志里明确写着 Permission denied、Read-only file system,再往下走;如果只是文件太大被拦,直接跳到第五步改 PHP 配置。
注意:Windows 版小皮面板的日志在「网站」→ 站点「管理」→「设置」→「日志」里,位置和 Linux 版不同,别找错地方。
第二步:Linux 版——把站点目录归属改回 www
这一步做完,PHP 进程才有权往目录里写文件。小皮面板 Linux 版默认用 www 用户跑 PHP,站点目录一般是 /www/wwwroot/你的域名。
方法一(面板操作):左侧「文件」→ 进入 /www/wwwroot/你的域名 → 勾选目录 → 点顶部「权限」按钮 → 所有者填 www、用户组填 www,权限填 755,勾选「应用到子目录」→ 确定。
方法二(SSH 命令):
chown -R www:www /www/wwwroot/你的域名
find /www/wwwroot/你的域名 -type d -exec chmod 755 {} \;
find /www/wwwroot/你的域名 -type f -exec chmod 644 {} \;
目录 755、文件 644 是安全底线。如果改完还是不行,说明进程用户不是 www,执行 ps aux | grep php-fpm 看第一列的实际用户名,按实际用户名改。
注意:别图省事直接 chmod -R 777。777 在共享主机上等于把目录交给所有人写,木马进来第一件事就是往里塞文件。
第三步:Windows 版——给 IIS_IUSRS 或运行账号写权限
Windows 版小皮面板的站点目录通常是 D:\phpstudy_pro\WWW\你的域名,PHP 以 IIS 应用程序池身份或 SYSTEM 运行。
在资源管理器里右键站点目录 →「属性」→「安全」选项卡 →「编辑」→「添加」→ 输入 IIS_IUSRS →「检查名称」→ 确定 → 在上方列表选中它 → 勾选「修改」和「写入」→ 确定。如果用的是 Apache/Nginx 模式跑 PHP-CGI,把 Everyone 也加进去,同样给「修改」权限。
回到上级的「安全」页,点「高级」→ 确认权限条目的「应用到」是「此文件夹、子文件夹和文件」,否则新上传的子目录不会继承。
注意:改完权限后要在面板「网站」里把站点停一下再启动,让 PHP-CGI 重新加载,否则旧的进程句柄还握着旧权限。
第四步:只放开真正需要写的目录
全站可写没必要。通常只需要给上传目录和缓存目录写权限,比如 /uploads、/runtime、/storage、/public/uploads。
Linux 下把这些目录设为 775、属主 www:www;Windows 下对这单个文件夹重复第三步,给「修改」权限即可。这样即使上传目录被塞了东西,也影响不到程序主体文件。
第五步:检查 PHP 上传配置和防跨站攻击
权限对了还传不上去,多半是配置卡住。到「网站」→ 站点「管理」→「设置」→「PHP 版本/配置」,确认:
file_uploads = On
upload_max_filesize 和 post_max_size 都调到你要的大小,且 post_max_size 要大于 upload_max_filesize
upload_tmp_dir 指向的临时目录存在且可写,Linux 下一般是 /tmp
同时看「防跨站攻击(open_basedir)」这个开关。它开着时 PHP 只能访问站点目录,如果临时目录不在允许范围内,上传就会失败。要么关掉它,要么在配置文件里把 /tmp 加进 open_basedir 白名单。改完记得在面板里「重载配置」或重启 PHP。
第六步:SELinux 兜底
CentOS 系如果上面全做完还报错,执行 getenforce,返回 Enforcing 就是它。临时验证用 setenforce 0,确认问题后正确做法是:
chcon -R -t httpd_sys_rw_content_t /www/wwwroot/你的域名/uploads
小结
- 先看日志确认是
Permission denied,别盲目改权限。
- Linux 版:站点目录属主改
www:www,目录 755、文件 644,不上 777。
- Windows 版:给
IIS_IUSRS 加「修改」和「写入」,注意权限要继承到子文件夹。
- 只给上传、缓存目录放开写权限,程序主体保持只读。
upload_max_filesize 要小于 post_max_size,open_basedir 要放行临时目录。
- SELinux 用
chcon 单独授权,别长期 setenforce 0。
- 改完权限或配置,重启一次 PHP 再验证上传。