我使用的Apache Web服务器的所有者设置为_www:_www。我从来不知道文件权限的最佳实践是什么,例如当我创建新的Laravel 5项目时。
Laravel 5要求/storage文件夹是可写的。我发现了很多不同的方法来让它工作,我通常以递归地使它为777 chmod结束。但我知道这不是个好主意。
官方医生说:
Laravel可能需要配置一些权限:其中的文件夹
存储和供应商要求web服务器进行写访问。
这是否意味着web服务器也需要访问存储和供应商文件夹本身,还是只需要访问它们的当前内容?
我认为更好的是更改所有者而不是权限。我将所有Laravel的文件权限递归地更改为_www:_www,这使得网站正常工作,就像我将chmod更改为777一样。问题是,现在每次我想保存任何文件时,我的文本编辑器都会要求我输入密码,如果我试图在Finder中更改任何内容,比如复制一个文件,也会发生同样的情况。
解决这些问题的正确方法是什么?
改变chmod
更改文件的所有者以匹配
web服务器,也许设置文本编辑器(和Finder?)跳过
询问密码,或者让他们使用sudo
更改web服务器的所有者以匹配操作系统用户(我不这样做
知道后果)
其他的东西
我有以下配置:
NGINX(运行用户:NGINX)
PHP-FPM
并正确应用权限@bgies建议在接受的答案。在我的案例中,问题是php-fpm配置的运行用户和组最初是apache。
如果你使用NGINX和php-fpm,你应该打开php-fpm的配置文件:
nano /etc/php-fpm.d/www.config
并将用户和组选项的值替换为一个NGINX配置工作;在我的例子中,两者都是nginx:
...
; Unix用户/进程组
; 备注:非必选用户。如果未设置组,则默认用户组
;将被使用。
; RPM: apache选择能够以httpd的方式访问某些目录
User = nginx
; RPM:在日志目录下保留一个允许写入的组。
Group = nginx
...
保存并重新启动nginx和php-fpm服务。
Laravel 5.4文档说:
在安装Laravel之后,您可能需要配置一些权限。
存储和引导/缓存目录中的目录
你的web服务器应该可以写,否则Laravel将无法运行。如果你
正在使用Homestead虚拟机,这些权限应该
已经设置好了。
本页上有很多答案提到使用777权限。不要那样做。你会把自己暴露在黑客面前。
相反,请遵循其他人关于如何将权限设置为755(或更严格的权限)的建议。您可能需要通过在终端中运行whoami来确定应用程序以哪个用户的身份运行,然后使用chown -R更改某些目录的所有权。
这对我来说很管用:
cd /code/laravel_project
php artisan cache:clear
php artisan config:clear
sudo service php7.4-fpm stop
sudo service nginx stop
sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache
chmod -R 775 storage
chmod -R 755 bootstrap/cache
sudo service php7.4-fpm start && sudo service nginx start
灵感来自https://stackoverflow.com/a/45673457/470749
如果您没有权限使用sudo,因为许多其他答案需要…
您的服务器可能是一个共享主机,例如Cloudways。
(在我的例子中,我把我的Laravel应用程序克隆到我的第二台Cloudways服务器上,它不能完全工作,因为存储和引导/缓存目录的权限被弄乱了。)
我需要使用:
Cloudways平台>服务器>应用程序设置>重置权限
然后我可以在终端中运行php artisan cache:clear。
对于Laravel开发人员来说,目录问题可能有点痛苦。在我的应用程序中,我正在动态地创建目录,并成功地将文件移动到本地环境中的这个目录中。然后在服务器上,我得到错误,而移动文件到新创建的目录。
以下是我所做的事情,并在最后获得了成功的结果。
Sudo find /path/to/your/laravel/root/directory -type f -exec chmod 664 {} \;
Sudo find /path/to/your/laravel/root/directory -type d -exec chmod 775 {} \;
chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
在动态创建新目录时,我使用命令mkdir($save_path, 0755, true);
在生产服务器上进行这些更改后,我成功地创建了新目录并将文件移动到其中。
最后,如果你在Laravel中使用File facade,你可以这样做:
文件::makeDirectory($save_path, 0755, true);
我有以下配置:
NGINX(运行用户:NGINX)
PHP-FPM
并正确应用权限@bgies建议在接受的答案。在我的案例中,问题是php-fpm配置的运行用户和组最初是apache。
如果你使用NGINX和php-fpm,你应该打开php-fpm的配置文件:
nano /etc/php-fpm.d/www.config
并将用户和组选项的值替换为一个NGINX配置工作;在我的例子中,两者都是nginx:
...
; Unix用户/进程组
; 备注:非必选用户。如果未设置组,则默认用户组
;将被使用。
; RPM: apache选择能够以httpd的方式访问某些目录
User = nginx
; RPM:在日志目录下保留一个允许写入的组。
Group = nginx
...
保存并重新启动nginx和php-fpm服务。