我使用的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服务器的所有者以匹配操作系统用户(我不这样做 知道后果) 其他的东西


当前回答

我还遵循了以用户为所有者的方式,用户是www-data的成员。

我的命令顺序有点不同:

cd /var/www/html/laravel-project-root 
sudo chown -R $USER:www-data .

sudo find . -type f -exec chmod 664 {} \;   
sudo find . -type d -exec chmod 775 {} \;

sudo find . -type d -exec chmod g+s {} \;  <----- NOTE THIS

sudo chgrp -R www-data storage bootstrap/cache 
sudo chmod -R ug+rwx storage bootstrap/cache

请注意这个答案的特殊性:我是唯一一个(在这里)给每个文件夹添加组位的人。通过这种方式,如果某人或某物创建了一个新的子文件夹,它将自动以www-data作为组

这发生在我们被迫部署一些用户域文件时,使用ftp预加载,因此新的子文件夹文件夹总是属于www-data组,即使是由ftp客户端创建的

还要注意 sudo chgrp -R www-data storage bootstrap/cache > .使用实例 如果执行列表中的所有命令,则不需要。但如果你想修复一个ftp部署,例如,你没有执行第二行,所以这是需要的。

其他回答

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。

大多数文件夹应该是正常的“755”,文件应该是“644”

Laravel要求一些文件夹对web服务器用户是可写的。该命令适用于unix操作系统。

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

Mac OS大交易

在我的情况下,工匠无法进入 /var/www/{project_name}/storage在/logs文件夹下创建文件 所以我必须手动去 /var并创建Laravel需要做符号链接的文件夹结构。 增加对文件夹的访问权限 sudo chgrp -R $USER /var/www/project_name 然后我就可以用 PHP工匠存储:链接没有任何问题。

我会这样做:

sudo chown -R $USER:www-data laravel-project/ 

find laravel-project/ -type f -exec chmod 664 {} \;

find laravel-project/ -type d -exec chmod 775 {} \;

最后,你需要给webserver修改存储和引导/缓存目录的权限:

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

在为Laravel应用程序设置权限时,我们遇到了许多边缘情况。我们创建了一个单独的用户帐户(deploy),用于拥有Laravel应用程序文件夹并从CLI执行Laravel命令,并在www-data下运行web服务器。这导致的一个问题是,日志文件可能由www-data或deploy拥有,这取决于谁先写入日志文件,这显然阻止了其他用户将来写入它。

我发现唯一明智而安全的解决方案是使用Linux acl。这个解决方案的目标是:

To allow the user who owns/deploys the application read and write access to the Laravel application code (we use a user named deploy). To allow the www-data user read access to Laravel application code, but not write access. To prevent any other users from accessing the Laravel application code/data at all. To allow both the www-data user and the application user (deploy) write access to the storage folder, regardless of which user owns the file (so both deploy and www-data can write to the same log file for example).

我们做到了以下几点:

All files within the application/ folder are created with the default umask of 0022, which results in folders having drwxr-xr-x permissions and files having -rw-r--r--. sudo chown -R deploy:deploy application/ (or simply deploy your application as the deploy user, which is what we do). chgrp www-data application/ to give the www-data group access to the application. chmod 750 application/ to allow the deploy user read/write, the www-data user read-only, and to remove all permissions to any other users. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/ to set the default permissions on the storage/ folder and all subfolders. Any new folders/files created in the storage folder will inherit these permissions (rwx for both www-data and deploy). setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/ to set the above permissions on any existing files/folders.