php file_exists(): open_basedir restriction in effect. File is not within the allowed path...
后台迁移服务器后,在上传文件时报错,提示 mkdir() 没有权限。查看目录发现,之前 Linux 外链了一个项目目录之外的文件夹(公共文件夹)丢失了。重新创建好外联,指向项目同级的公共文件夹。测试上传文件报了这个错误:open_basedir restriction in effect. File is not within the allowed path
。
之前没有遇到过这种情况,一般上传文件就是文件夹没有权限,chown www:www
或者 chmod 777 target_dir
也就解决了。百度这个问题,解决方法都指向了 open_basedir
。
这个变量之前没碰到过,大概的作用是限定用户可操作的目录范围。在 php.ini
、fastcgi.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