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


当前回答

我会这样做:

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

其他回答

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

所以要解决这个问题

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

然后编辑 用户= "把拥有目录的用户" Group = "put拥有目录的用户"

然后:

Sudo systemctl reload php7.0-fpm

对于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);

我已经使用这个代码片段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

这是在2017年编写的,大约版本5.1~5.2。在Laravel的后续版本中使用此功能之前,请先了解一些常识。

我决定编写自己的脚本,以减轻建立项目的痛苦。

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

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

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

使用前请检查脚本。

我会这样做:

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