Laravel 5.5调用/api/register接口遇file_put_contents权限问题求助
你这完全是踩中了VirtualBox共享文件夹的权限坑——这跟Laravel版本、Passport都没啥关系,核心问题是共享文件夹的权限是由你的Mac宿主系统管控的,虚拟机里执行的chown/chmod根本不会生效,所以你改完权限后目录所有者还是root,缓存写入自然失败。
下面给你几个可行的解决方案,按实用性排序:
方案一:修改共享文件夹挂载参数(推荐)
直接在挂载共享文件夹时指定匹配www-data用户的UID和GID(Ubuntu中www-data的UID/GID默认是33),让虚拟机里的web服务器用户拥有合法写入权限:
- 先卸载当前挂载的共享文件夹:
sudo umount /var/www/laravel - 重新挂载并带上权限参数:
注意把sudo mount -t vboxsf 你的共享文件夹名称 /var/www/laravel -o uid=33,gid=33,rw你的共享文件夹名称替换成你在VirtualBox里设置的共享文件夹名。 - 让配置永久生效:编辑
/etc/fstab文件,添加一行配置,这样开机后会自动按正确权限挂载:你的共享文件夹名称 /var/www/laravel vboxsf uid=33,gid=33,rw 0 0
完成后执行ls -l /var/www/laravel/storage,就能看到所有者已经变成www-data了,再测试注册接口就不会报错。
方案二:切换Laravel缓存驱动(快速临时解决)
如果不想折腾挂载配置,可以直接绕开文件缓存,改用内存级的数组缓存:
修改项目根目录的.env文件,把缓存驱动改成array:
CACHE_DRIVER=array
数组缓存适合开发环境,所有缓存都存在内存里,完全不会涉及文件写入操作。如果是生产环境,建议安装Redis并设置CACHE_DRIVER=redis。
方案三:把项目复制到虚拟机本地目录
如果共享文件夹不是刚需,可以把项目复制到虚拟机的本地磁盘(比如/home/ubuntu/laravel),然后设置正常权限:
# 复制项目到本地目录 cp -r /var/www/laravel /home/ubuntu/ # 设置目录权限 sudo chown -R www-data:www-data /home/ubuntu/laravel sudo chmod -R 775 /home/ubuntu/laravel/storage sudo chmod -R 775 /home/ubuntu/laravel/bootstrap/cache
之后修改Nginx的站点配置,将根目录指向这个本地路径即可。
为什么之前的权限命令没用?
VirtualBox共享文件夹用的是vboxsf文件系统,它不支持Linux的传统权限位修改——你在虚拟机里执行的chown/chmod只是表面显示生效,实际权限还是由宿主系统的文件权限决定,所以web服务器用户依然没有缓存目录的写入权限。
内容的提问来源于stack exchange,提问作者Riley Bolen

