后台迁移服务器后,在上传文件时报错,提示 mkdir() 没有权限。查看目录发现,之前 Linux 外链了一个项目目录之外的文件夹(公共文件夹)丢失了。重新创建好外联,指向项目同级的公共文件夹。测试上传文件报了这个错误:open_basedir restriction in effect. File is not within the allowed path

之前没有遇到过这种情况,一般上传文件就是文件夹没有权限,chown www:www 或者 chmod 777 target_dir 也就解决了。百度这个问题,解决方法都指向了 open_basedir

这个变量之前没碰到过,大概的作用是限定用户可操作的目录范围。在 php.inifastcgi.conf 和虚拟主机(vhost)配置中都可以设置,甚至宝塔面板创建的项目还可以在项目下的 .user.ini 中进行定义。以下方法使用一种即可,修改方式不同,open_basedir 的作用范围也有一些差别。

修改 php.ini

作用范围:使用 php 解析的所有项目[未测试]

多个目录用 : 间隔。

open_basedir = "/root/wwwroot/tp6/public:/tmp/:/proc/"

修改 fastcgi.conf

作用范围:使用 php 解析的所有项目

nginx 服务器为例,修改 fastcgi_param PHP_ADMIN_VALUE 的值:

fastcgi_param  PHP_ADMIN_VALUE  "open_basedir=$document_root:/tmp/:/proc/"; 

修改虚拟主机配置

作用范围:虚拟主机(项目)[未测试]

nginx 服务器为例,修改 fastcgi_param PHP_VALUE 的值:

fastcgi_param  PHP_VALUE  "open_basedir=$document_root:/tmp/:/proc/"; 

修改 .user.ini 文件(宝塔面板创建的项目)

作用范围:当前项目[未测试]

宝塔面板创建的项目目录下会生成一个 .user.ini 文件,可自定义配置一些参数。

可以修改文件里的 open_basedir 值,也可以直接删除改文件。

# 解锁文件,正常情况该文件禁止删除的
​chattr -i /www/wwwroot/your project/.user.ini

# 删除该文件
rm -f .user.ini

参考:
open_basedir限制每个站点的目录范围,防止跨站 - CSDN
php open_basedir...宝塔面板创建的项目 - CSDN