如何为 Laravel 设置文件权限?

How to set up file permissions for Laravel?

提问人:Robo Robok 提问时间:6/4/2015 最后编辑:Script47Robo Robok 更新时间:2/23/2023 访问量:740114

问:

我正在使用所有者设置为 的 Apache Web Server。我永远不知道文件权限的最佳实践是什么,例如当我创建新的 Laravel 5 项目时。_www:_www

Laravel 5 要求文件夹是可写的。我发现了很多不同的方法来使它工作,我通常以递归方式使它成为chmod结束。我知道这不是最好的主意。/storage777

官方文档说:

Laravel可能需要配置一些权限:文件夹,并且需要Web服务器的写入访问权限。storagevendor

这是否意味着 Web 服务器也需要访问 and 文件夹本身,或者只需要访问其当前内容?storagevendor

我认为更好的是更改所有者而不是权限。我递归地更改了 Laravel 的所有文件权限,这使网站正常工作,就好像我将 chmod 更改为 .问题是现在每次我想保存任何文件时,我的文本编辑器都会要求我输入密码,如果我尝试在 Finder 中更改任何内容,例如复制文件,也会发生同样的情况。_www:_www777

解决这些问题的正确方法是什么?

  1. 改变chmod
  2. 更改文件的所有者以匹配 Web 服务器,也许将文本编辑器(和 Finder?)设置为跳过 要求输入密码,或让他们使用sudo
  3. 更改 Web 服务器的所有者以匹配 os 用户(我不 知道后果)
  4. 别的
php Apache laravel laravel-5 文件权限

评论

10赞 Robo Robok 6/4/2015
我认为自由太多了,因为它包括每个人的所有权限。777
1赞 9/25/2016
来自 Laravel 文档:和 目录中的目录应可由 Web 服务器写入storagebootstrap/cache
1赞 Jeffz 3/24/2018
使用 FCGI,您可以 755/644 用于所有(包括公共/存储)
0赞 wp78de 12/24/2018
@jww同意我们可以将问题转移到服务器故障而不是将其搁置吗?

答:

26赞 Bogdan 6/4/2015 #1

更改项目文件夹的权限,以便为拥有该目录的组中的任何用户启用读/写/exec(在您的情况下为):_www

chmod -R 775 /path/to/your/project

然后将您的 OS X 用户名添加到群组以允许其访问该目录:_www

sudo dseditgroup -o edit -a yourusername -t user _www

评论

0赞 Robo Robok 6/4/2015
当我提供您时,我收到一个错误:.dseditgroupUsername and password must be provided.
0赞 Bogdan 6/4/2015
我的错误,您需要使用具有适当权限的用户运行该命令,因此只需在开头添加即可。sudo
0赞 Robo Robok 6/4/2015
那么,我是否需要将这些文件的所有者更改为 or 以及?_www:_wwwmyuser:_www
0赞 Bogdan 6/4/2015
您可以保留它,因为 775 表示组中的任何用户都将拥有在该文件夹中读取/写入/执行的完全权限,并且您刚刚将用户名添加到该组。_www:_www_www
0赞 Robo Robok 6/4/2015
你能告诉我一件事吗?这是什么意思?我知道第一个是用户,第二个是组,但它的意思是“这个用户和这个组中的任何人”还是“这个用户,但只有当他属于这个组”?chown myuser:_www
85赞 BassMHL 6/10/2015 #2

出于明显的安全原因,和 文件夹的权限应保持在 ,。storagevendor775

但是,您的计算机和服务器 Apache 都需要能够在这些文件夹中写入。例如:当您运行类似 的命令时,您的计算机需要将日志文件写入 。php artisanstorage

您需要做的就是将文件夹的所有权授予 Apache:

sudo chown -R www-data:www-data /path/to/your/project/vendor
sudo chown -R www-data:www-data /path/to/your/project/storage

然后,您需要将用户(由其引用)添加到Apache所属的服务器组。这样:username

sudo usermod -a -G www-data userName

注意:最常见的是,组名是 但在您的情况下,将其替换为www-data_www

评论

13赞 Jason Wheeler 5/24/2016
+1 我喜欢这种方法。但我相信这些命令应该包括 -R 标志。此外,在 laravel 5.1 和 5.2 中,您应该授予对 bootstrap/cache 目录的访问权限,而不是供应商目录。chown
0赞 StealthTrails 12/26/2018
有没有办法测试这是否正常工作?我的意思是,如果在具有正确权限的存储/日志目录中创建了新的日志文件,我该如何检查?
0赞 Adam 7/4/2020
你的意思是什么?服务器和个人计算机中的用户之间的文件权限不会共享。your computer needs to write in the logs file in storage
1045赞 bgies 5/17/2016 #3

只是为了让任何观看此讨论的人都明白这一点......如果您授予任何文件夹 777 权限,则允许任何人读取、写入和执行该目录中的任何文件。这意味着您已经授予任何人(全世界的任何黑客或恶意人员)上传任何文件、病毒或任何其他文件的权限,然后执行该文件......

如果您将文件夹权限设置为 777,则您已打开 服务器到可以找到该目录的任何人。足够清楚???:)

基本上有两种方法可以设置您的所有权和权限。要么给自己所有权,要么让 Web 服务器成为所有文件的所有者。

Webserver 作为所有者(大多数人的做法,以及 Laravel 文档的方式):

假设 www-data(可能是其他东西)是您的 Web 服务器用户。

sudo chown -R www-data:www-data /path/to/your/laravel/root/directory

如果您这样做,Web 服务器拥有所有文件,并且也是组,您将在通过 FTP 上传文件或处理文件时遇到一些问题,因为您的 FTP 客户端将以您的身份登录,而不是您的 Web 服务器,因此将您的用户添加到 Web 服务器用户组:

sudo usermod -a -G www-data ubuntu

当然,这假设您的 Web 服务器以 www-data(Homestead 默认值)运行,并且您的用户是 ubuntu(如果您使用 Homestead,则它是流浪者)。

然后,将所有目录设置为 755,将文件设置为 644... SET 文件权限

sudo find /path/to/your/laravel/root/directory -type f -exec chmod 644 {} \;    

SET 目录权限

sudo find /path/to/your/laravel/root/directory -type d -exec chmod 755 {} \;

作为所有者的用户

我更喜欢拥有所有的目录和文件(它使处理所有内容变得更加容易),所以,转到你的 laravel 根目录:

cd /var/www/html/laravel >> assuming this is your current root directory
sudo chown -R $USER:www-data .

然后我给自己和 Web 服务器权限:

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

然后授予 Web 服务器读取和写入存储和缓存的权限

无论您采用哪种方式进行设置,您都需要向 Web 服务器授予读取和写入权限,以存储、缓存和 Web 服务器需要上传或写入的任何其他目录(取决于您的情况),因此请运行上面 bashy 的命令:

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

现在,您是安全的,您的网站可以正常工作,并且您可以相当轻松地处理这些文件

评论

9赞 Denis Solakovic 10/6/2016
很好的例子,如果没有 www-data 用户,请使用 apache:apache 代替 www-data(在某些发行版上)
159赞 Marco Aurélio Deleu 10/8/2016
我认为人们误解了太多这个概念。Linux 的标志意味着任何用户,而不是任何人。您仍然需要服务器访问权限。anyoneanyone
3赞 Denis Solakovic 1/26/2017
@andreshg112 第一个 www-data 是用户的名称,第二个 www-data 是组的名称。所以这意味着所有者是 apache 和(这个组)apache。使用 www-data:www-data 或将用户添加到该组。(CLI: useradd -G {group-name} username ),然后你可以切换到 username:www-group
4赞 bgies 4/5/2017
@fs_tigre 我认为安全性根本没有太大区别......除了我猜有两个用户可以猜测密码而不是一个用户,当然我一直使用我的用户帐户登录,所以如果我以不安全的方式(例如普通 FTP 和使用密码)这样做,它可能会危及网站,但我只使用 Putty 和 SSH 登录, 当我使用 FTP 时,它是 SFTP,所以完全没有问题。建议使用 bashy 建议的命令,因为它们设置了粘滞位,因此如果您的 Web 服务器创建了子目录,它们将具有与父目录相同的所有者/权限
4赞 Fahmi 6/9/2017
在第一种方法中,由于您没有授予组权限,用户是否仍然无法上传文件?write
10赞 Stanislav Potapenko 6/1/2016 #4

正如已经发布的

您需要做的就是将文件夹的所有权授予 Apache:

但我为 chown 命令添加了 -R sudo chown -R www-data:www-data /path/to/your/project/vendor sudo chown -R www-data:www-data /path/to/your/project/storage

评论

3赞 haris 9/18/2016
为什么我们必须授予供应商目录的权限?存储有意义,写入日志文件等。 但是供应商呢?为什么?
0赞 Stanislav Potapenko 11/15/2016
正如上面的一些评论所写的:“但是,您的计算机和服务器Apache都需要能够在这些文件夹中写入。例如:当您运行 php artisan 之类的命令时,您的计算机需要将日志文件写入存储中。
0赞 Sunil Kumar 4/6/2018
mac上的错误:chown:www-data:非法组名
0赞 Stanislav Potapenko 4/18/2018
请看 stackoverflow.com/questions/8035939/...
11赞 markdwhite 12/6/2016 #5

bgles 发布的解决方案在最初正确设置权限方面对我来说是正确的(我使用第二种方法),但它对 Laravel 仍然存在潜在问题。

默认情况下,Apache 将创建具有 644 权限的文件。所以这几乎是存储/中的任何东西。因此,如果您删除 storage/framework/views 的内容,然后通过 Apache 访问页面,您会发现缓存的视图已创建如下所示:

-rw-r--r-- 1 www-data www-data 1005 Dec  6 09:40 969370d7664df9c5206b90cd7c2c79c2

如果您运行“artisan serve”并访问不同的页面,您将获得不同的权限,因为 CLI PHP 的行为与 Apache 不同:

-rw-rw-r-- 1 user     www-data 16191 Dec  6 09:48 2a1683fac0674d6f8b0b54cbc8579f8e

就其本身而言,这没什么大不了的,因为您不会在生产中执行任何操作。但是,如果 Apache 创建了一个随后需要由用户编写的文件,它将失败。这适用于使用登录用户和工匠进行部署时的缓存文件、缓存视图和日志。一个简单的例子是“artisan cache:clear”,它将无法删除任何 www-data:www-data 644 的缓存文件。

这可以通过将 artisan 命令作为 www-data 运行来部分缓解,因此您将执行/编写以下所有内容:

sudo -u www-data php artisan cache:clear

或者,您将避免这样做的乏味,并将其添加到您的.bash_aliases中:

alias art='sudo -u www-data php artisan'

这已经足够好了,不会以任何方式影响安全性。但是在开发机器上,运行测试和清理脚本会使这变得笨拙,除非您想设置别名以使用“sudo -u www-data”来运行 phpunit 以及您检查构建时使用的所有其他可能导致创建文件的内容。

解决方案是遵循 bgles 建议的第二部分,并将以下内容添加到 /etc/apache2/envvars,然后重新启动(而不是重新加载)Apache:

umask 002

这将强制 Apache 默认将文件创建为 664。这本身就可能带来安全风险。然而,在本文主要讨论的 Laravel 环境(Homestead、Vagrant、Ubuntu)上,Web 服务器在组 www-data 下以用户 www-data 身份运行。因此,如果您不任意允许用户加入 www-data 组,应该不会有额外的风险。如果有人设法突破了网络服务器,他们无论如何都有www-data访问级别,所以不会丢失任何东西(尽管这不是与安全有关的最佳态度)。因此,在生产环境中,它相对安全,而在单用户开发机器上,这不是问题。

最终,由于您的用户位于 www-data 组中,并且包含这些文件的所有目录都是 g+s(该文件始终在父目录的组下创建),因此用户或 www-data 创建的任何内容都将是另一个的 r/w。

这就是这里的目标。

编辑

在进一步研究上述设置权限的方法时,它看起来仍然足够好,但一些调整会有所帮助:

默认情况下,目录为 775,文件为 664,所有文件都具有刚刚安装框架的用户的所有者和组。因此,假设我们从这一点开始。

cd /var/www/projectroot
sudo chmod 750 ./
sudo chgrp www-data ./

我们要做的第一件事是阻止对其他人的访问,并使该组成为 www-data。只有 www-data 的所有者和成员才能访问该目录。

sudo chmod 2775 bootstrap/cache
sudo chgrp -R www-data bootstrap/cache

为了允许 Web 服务器创建services.json和编译.php,正如官方 Laravel 安装指南所建议的那样。设置组粘性位意味着这些位将由创建者拥有一组 www-data。

find storage -type d -exec sudo chmod 2775 {} \;
find storage -type f -exec sudo chmod 664 {} \;
sudo chgrp -R www-data storage

我们对存储文件夹执行相同的操作,以允许创建缓存、日志、会话和查看文件。我们使用 find 为目录和文件显式设置不同的目录权限。我们不需要在引导/缓存中执行此操作,因为那里(通常)没有任何子目录。

您可能需要重新应用任何可执行标志,并删除 vendor/* 并重新安装 composer 依赖项以重新创建 phpunit 等人的链接,例如:

chmod +x .git/hooks/*
rm vendor/*
composer install -o

就是这样。除了上面解释的 Apache 的 umask 之外,这是所有需要的,而无需使整个 projectroot 可由 www-data 写入,这是其他解决方案所发生的情况。因此,这种方式稍微安全一些,因为以 www-data 身份运行的入侵者具有更有限的写入访问权限。

结束编辑

Systemd 的更改

这适用于 php-fpm 的使用,但也许其他的也是如此。

需要覆盖标准的 systemd 服务,在 override.conf 文件中设置 ummask,然后重新启动服务:

sudo systemctl edit php7.0-fpm.service
Use:
    [Service]
    UMask=0002
Then:
sudo systemctl daemon-reload
sudo systemctl restart php7.0-fpm.service

评论

0赞 owis sabry 6/2/2023
第二部分解决了问题
49赞 Chris Schwerdt 12/22/2016 #6

在为 Laravel 应用程序设置权限时,我们遇到了许多边缘情况。我们创建一个单独的用户帐户 () 来拥有 Laravel 应用程序文件夹并从 CLI 执行 Laravel 命令,并在 .这会导致的一个问题是日志文件可能归 or 所有,具体取决于谁先写入日志文件,这显然会阻止其他用户将来写入日志文件。deploywww-datawww-datadeploy

我发现唯一理智和安全的解决方案是使用 Linux ACL。此解决方案的目标是:

  1. 为了允许拥有/部署应用程序的用户对 Laravel 应用程序代码进行读写访问(我们使用名为 )。deploy
  2. 允许用户读取 Laravel 应用程序代码,但不允许写入访问。www-data
  3. 防止任何其他用户访问Laravel应用程序代码/数据。
  4. 允许用户和应用程序用户 () 对存储文件夹进行写入访问,而不管哪个用户拥有该文件(例如,两者都可以写入同一个日志文件)。www-datadeploydeploywww-data

我们按如下方式实现此目的:

  1. 文件夹中的所有文件都是使用默认的掩码 创建的,这会导致文件夹具有权限,而文件具有 。application/0022drwxr-xr-x-rw-r--r--
  2. sudo chown -R deploy:deploy application/(或者干脆将您的应用程序部署为用户,这就是我们所做的)。deploy
  3. chgrp www-data application/以授予组对应用程序的访问权限。www-data
  4. chmod 750 application/允许用户读/写,用户只读,并删除任何其他用户的所有权限。deploywww-data
  5. setfacl -Rdm u:www-data:rwx,u:deploy:rwx application/storage/设置文件夹和所有子文件夹的默认权限。在存储文件夹中创建的任何新文件夹/文件都将继承这些权限(对于 和 )。storage/rwxwww-datadeploy
  6. setfacl -Rm u:www-data:rwX,u:deploy:rwX application/storage/对任何现有文件/文件夹设置上述权限。

评论

5赞 Sven 8/4/2020
这是唯一使用 ACL 的答案,就像作者所说,这也是我发现设置 Laravel 的唯一“理智和安全”的解决方案。真的很欣赏这个答案。
0赞 sakinobashi 2/25/2021
不应该将 -R 标志添加到命令 3 和 4 中吗?
0赞 Chris Schwerdt 3/3/2021
无需更改所有子目录/文件的权限,因为对顶级应用程序文件夹没有执行权限的用户/组将无法访问该目录或子目录中的任何数据(即使子目录/文件是)。有关详细信息,请参阅此问题和答案777
1赞 Kevin Wheeler 8/30/2022
默认的 umask 不是 0002 吗?我应该创建一个“deploy”用户并将其掩码设置为 0022 吗?
1赞 Kevin Wheeler 9/7/2022
这个答案是否需要更新才能在 上运行命令?setfaclbootstrap/cache
1赞 Jonathan 3/11/2017 #7

这是在 2017 年为 5.1~5.2 版本编写的。在更高版本的 Laravel 上使用它之前,请使用一些常识。

我决定编写自己的脚本,以减轻设置项目的一些痛苦。

在项目根目录中运行以下命令:

wget -qO- https://raw.githubusercontent.com/defaye/bootstrap-laravel/master/bootstrap.sh | sh

等待引导完成,你就可以开始了。

使用前查看脚本

21赞 Ryan 5/27/2017 #8

Laravel 5.4 文档说:

安装 Laravel 后,您可能需要配置一些权限。 和 目录中的目录 应该可由您的 Web 服务器写入,否则 Laravel 将无法运行。如果你 正在使用 Homestead 虚拟机,这些权限应 已经设置好了。storagebootstrap/cache

此页面上有很多提到使用权限的答案。别这样。你会把自己暴露在黑客面前。777

相反,请遵循其他人关于如何设置 755(或更严格)权限的建议。您可能需要通过在终端中运行来确定您的应用正在以哪个用户身份运行,然后使用 更改某些目录的所有权。whoamichown -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 服务器中,但它并没有完全工作,因为 和 目录的权限被搞砸了。storagebootstrap/cache

我需要使用:

Cloudways Platform > Server > Application Settings > Reset Permission

然后我就可以在终端中运行了。php artisan cache:clear

评论

0赞 CodeConnoisseur 1/20/2022
我运行这些命令,但每次清除配置时都必须重新运行它们。有没有办法防止这种情况发生?
16赞 Siddharth 6/6/2017 #9

大多数文件夹应该是普通的“755”和文件“644”

Laravel要求某些文件夹对Web服务器用户是可写的。您可以在基于 unix 的操作系统上使用此命令。

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
4赞 Hacken Lee 7/15/2017 #10

我已经在 EC2 实例上安装了 laravel,并花了 3 天时间修复权限错误并最终修复了它。 所以我想与其他人分享这个经验。

  1. 用户问题 当我登录 ec2 实例时,我的用户名是 ec2-user,usergroup 是 ec2-user。 该网站在httpd user: apache: apache下工作 所以我们应该设置 Apache 的权限。

  2. 文件夹和文件权限 A. 文件夹结构 首先,您应该确保在存储下具有这样的文件夹结构

    存储

    • 框架
      • 缓存
      • 会话
      • 视图
    • 原木 文件夹结构可能因您使用的 laravel 版本而异。 我的Laravel版本是5.2,您可以根据自己的版本找到合适的结构。

B. 许可 首先,我看到将 777 设置为存储以删除file_put_contents的说明:无法打开流错误。 所以我设置了存储权限 777 chmod -R 777 存储 但是错误没有修复。 在这里,您应该考虑一个问题:谁将文件写入存储/会话和视图。 那不是 ec2-user,而是 apache。 是的,对。 “apache”用户将文件(会话文件、编译的视图文件)写入会话和视图文件夹。 因此,您应该授予 apache 对这些文件夹的写入权限。 默认情况下:SELinux 表示 /var/www 文件夹应该由 apache 执事只读。

因此,我们可以将 selinux 设置为 0: 设置强制执行 0

这可以暂时解决问题,但这会使mysql无法正常工作。 所以这不是很好的解决方案。

您可以使用以下命令为存储文件夹设置读写上下文:(记得设置强制执行 1 进行测试)

chcon -Rt httpd_sys_content_rw_t storage/

然后你的问题就会得到解决。

  1. 别忘了这一点 Composer 更新 PHP Artisan 缓存:清除

    这些命令在之后或之前都很有用。

    我希望你能节省你的时间。 祝你好运。哈肯

评论

0赞 Volatil3 4/11/2018
您是否尝试从 Web 服务器调用命令行脚本?我有问题,因为它不打印任何输出
0赞 mrtechmaker 1/10/2023
嗨,我正在使用 nginx,但 Laravel 使用 Apache 用户:)创建新文件我该如何更改此内容。创建的新文件应使用 nginx 用户
-1赞 CecilMerrell aka bringrainfire 10/19/2017 #11

我找到了一个更好的解决方案。 这是因为 php 默认以另一个用户身份运行。

所以要解决这个问题,请做

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

然后编辑 user = "put user that owns the directories" group = "put user that owns the directories"

然后:

sudo systemctl reload php7.0-fpm

评论

0赞 markdwhite 11/15/2017
如果网页的访问者设法跳出网络服务器,他们现在将拥有“拥有目录的用户”的访问权限。如果该用户是 www-data,那么他们可以造成的损害是有限的,这就是 apache 作为有限用户运行的原因。如果该用户没有受到如此限制,他们可能会造成更大的伤害。如果该用户具有 sudo 权限,他们可以造成更大的损害。
0赞 CecilMerrell aka bringrainfire 11/16/2017
这与apache相同。顺便说一句,我现在像个大男孩一样运行 nignx
1赞 mrtechmaker 1/10/2023
这确实对我有用。我正在使用 nginx 和 php-fpm 的用户作为 apache,所以正在使用 Apache 用户创建新用户
11赞 Davron Achilov 10/9/2018 #12

加入composer.json

"scripts": {
    "post-install-cmd": [
      "chgrp -R www-data storage bootstrap/cache",
      "chmod -R ug+rwx storage bootstrap/cache"
    ]
}

composer install

评论

5赞 mbozwood 11/9/2018
这是一个糟糕的答案。如果您正确配置了 Web 服务器,则永远不需要将 777 用于任何文件夹。使用 777 可以打开您的服务器,让任何黑客上传文件,如果他们知道文件夹存在的位置,则执行该文件。
2赞 Davron Achilov 11/9/2018
好。你们提供什么?
0赞 Davron Achilov 11/9/2018
如果是这样,它会是对的吗?chown -R $USER:www-数据存储, chown -R $USER:www-数据引导/缓存
0赞 mbozwood 11/9/2018
查看正确答案,它包含您绝对可以放入更新后:)的所有必要信息
0赞 Amirreza Nasiri 11/8/2018 #13

我有以下配置:

  • NGINX(运行用户:nginx)
  • PHP-FPM的

并按照接受的答案中建议@bgies正确应用权限。就我而言,问题是php-fpm配置的运行用户和组,它最初是.apache

如果你将 NGINX 与 php-fpm 一起使用,你应该打开 php-fpm 的配置文件:

nano /etc/php-fpm.d/www.config

并将 和 options 的值配置为一个 NGINX 以使用;就我而言,两者都是:usergroupnginx

... ; Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user's group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx ...

保存并重新启动 nginx 和 php-fpm 服务。

0赞 Mycodingproject 12/15/2019 #14

对于Laravel开发人员来说,目录问题可能有点痛苦。在我的应用程序中,我正在动态创建目录,并成功地将文件移动到本地环境中的此目录。然后在服务器上,我在将文件移动到新创建的目录时遇到错误。

以下是我做过的事情,最后得到了一个成功的结果。

  1. 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 {} \;
  2. chcon -Rt httpd_sys_content_rw_t /path/to/my/file/upload/directory/in/laravel/project/
  3. 在动态创建新目录时,我使用了以下命令mkdir($save_path, 0755, true);

在生产服务器上进行这些更改后,我成功创建了新目录并将文件移动到其中。

最后,如果你在 Laravel 中使用 File façade,你可以做这样的事情:File::makeDirectory($save_path, 0755, true);

38赞 Luca C. 2/13/2020 #15

这对我有用:

cd [..LARAVEL PROJECT ROOT]
sudo find . -type f -exec chmod 644 {} \;
sudo find . -type d -exec chmod 755 {} \;
sudo chmod -R 777 ./storage
sudo chmod -R 777 ./bootstrap/cache/

仅当您使用 npm(VUE、编译 SASS 等)时,才添加以下内容:

sudo chmod -R 777 ./node_modules/

它的作用:

  • 将所有文件权限更改为 644
  • 将所有文件夹权限更改为 755
  • 对于存储和引导缓存(laravel用于创建和执行文件的特殊文件夹,无法从外部获得),对于内部的任何内容,将权限设置为777
  • 对于 nodeJS 可执行文件,同上

注意:也许你不能,或者不需要,用sudo前缀来做。这取决于用户的权限、组等......

评论

0赞 Mahesh Samudra 10/5/2021
我只阅读了问题的标题,为此,这就是答案。这居然救了我!谢谢。
0赞 Sumit Wadhwa 1/7/2021 #16

我会这样做:

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

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

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

最后,您需要授予 Web Server 修改 and 目录的权限:storagebootstrap/cache

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
-1赞 Ranjan Fadia 4/7/2021 #17
sudo chown -R $USER:www-data your_directory_name_under_storage_app

它将为服务器用户和服务器提供文件访问所需的权限。

-1赞 devzom 9/25/2021 #18

Mac 操作系统 Big Sur

  1. 就我而言,工匠无法访问

    创建文件,例如在 /logs 文件夹中 所以我不得不手动去并创建 Laravel 需要制作符号链接的文件夹结构。
    /var/www/{project_name}/storage/var

  2. 添加对文件夹的访问权限sudo chgrp -R $USER /var/www/project_name

  3. 然后我就可以毫无问题地使用 php artisan storage:link

0赞 alex toader 1/4/2022 #19

如果某些文件中有一些代码更改,然后又发生了一些权限更改,则设置正确的权限并再次提交可能比尝试选取具有权限更改的文件更容易。 您只剩下代码更改。

13赞 realtebo 2/10/2022 #20

我也遵循了将用户作为所有者的方式,并且用户是 .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

请注意这个答案的特殊性:我是唯一一个(在这里)将组位添加到每个文件夹的人。这样,如果某人或某物创建了一个新的子文件夹,它会自动具有 as groupwww-data

当我们被迫部署一些使用 FTP 预加载的用户空间文件时,就会发生这种情况,因此即使由 FTP 客户端创建,新的子文件夹文件夹也始终来自 www-data 组

另请注意,

sudo chgrp -R www-data storage bootstrap/cache >

如果执行列表中的所有命令,则不需要。但是,如果您想修复 ftp 部署,例如,并且您没有执行第 2 行,那么这是必需的。

4赞 bingglex 8/6/2022 #21

我已经使用这个片段超过 3 年了。


laravel new demo 

cd demo 

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

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

php artisan storage:link

@realtebo建议看起来不错。我将尝试。

sudo find . -type d -exec chmod g+s {} \;  <----- NOTE THIS
3赞 Bhargav Raviya 2/23/2023 #22

我们将授予 755 存储权限和 bootstrap 文件夹权限

sudo chmod -R 755 bootstrap/cache
sudo chmod -R 755 storage

解决方案 2 我们会将所有文件和文件夹所有权授予 Web 服务器用户

sudo chown -R www-data:www-data /var/www/your-project-path

为所有文件设置 644 权限,为所有目录设置 755 权限。

sudo find /var/www/your-project-path -type f -exec chmod 644 {} \; 
sudo find /var/www/your-project-path -type d -exec chmod 755 {} \; 

我们将为文件和文件夹提供适当的读写权限。

cd /var/www/your-project-path
sudo chgrp -R www-data storage bootstrap/cache 
sudo chmod -R ug+rwx storage bootstrap/cache 

最重要的是 Ubuntu 服务器的所有细节