我是 Laravel 的新手。我试图打开 http://localhost/test/public/
,我得到了
异常处理程序中的错误。
我四处搜索并使用 chmod -R 777 app/storage
更改了存储目录的权限,但无济于事。
我在 app.php
中更改了 debug=>true
并访问了该页面并在异常处理程序中出现错误:
无法打开流或文件“/var/www/html/test/app/storage/logs/laravel.log”:无法打开流:/var/www/html/test/bootstrap/compiled 中的权限被拒绝。 php:8423
然后我使用命令 chmod -R 644 app/storage
更改了存储目录的权限,并且“异常处理程序中的错误”错误消失了,并且加载了一个页面。但在那里我得到了这个:
file_put_contents(/var/www/html/laravel/app/storage/meta/services.json):无法打开流:权限被拒绝
php artisan cache:clear
然后 chmod -R 777 app/storage
最后 php artisan dump-autoload
vsmoraes 的建议对我有用:
拉拉维尔> = 5.4
php artisan cache:clear
chmod -R 775 storage/
composer dump-autoload
拉拉维尔 < 5.4
php artisan cache:clear
chmod -R 775 app/storage
composer dump-autoload
对于那些在 Laravel 5 中遇到这个问题的人来说,这是一个权限问题,因为不同的用户试图以不同的权限写入 storage/logs
文件夹中的同一个日志文件。
发生的情况是您的 Laravel 配置可能设置为每天记录错误,因此您的 Web 服务器(Apache/nginx)可能会根据您的环境在默认用户下创建此文件,它可能类似于 OSX 上的 _www
或 www-data
*NIX 系统,那么当您可能运行了一些工匠命令并遇到一些错误时,问题就出现了,因此工匠将使用不同的用户编写此文件,因为终端上的 PHP 由不同的用户执行,实际上是您的登录用户,您可以通过运行以下命令检查它:
php -i | grep USER
如果您的登录用户在您的 Web 服务器上创建了该日志文件,您将无法在其中写入错误,反之亦然,因为 Laravel 默认写入具有 655
权限的日志文件,它只允许所有者写入其中。
要修复此临时问题,您必须手动授予组 664
对此文件的权限,以便您的登录用户和 Web 服务器用户都可以写入该日志文件。
为永久避免此问题,您可能希望在 storage/logs
目录中创建新文件时通过从目录继承权限来设置适当的权限,此答案 https://unix.stackexchange.com/a/115632 可以帮助您解决该问题。
您不应授予 777 权限。这是一个安全风险。对于 Ubuntu 用户,在 Laravel 5 中,我建议递归地更改目录存储的所有者:
尝试以下操作:
sudo chown -R www-data:www-data storage
在基于 Ubuntu 的系统中,www-data 是 apache 用户。
对于使用 Laravel 5、Homestead 和 Mac 的每个人,试试这个:
mkdir storage/framework/views
有时 SELINUX 会导致这个问题;您可以使用此命令禁用 selinux。
sudo setenforce 0
永远不要给它许可 777!
转到终端上的 laravel 项目目录并写入:
sudo chown -R your-user:www-data /path/to/your/laravel/project/
sudo find /same/path/ -type f -exec chmod 664 {} \;
sudo find /same/path/ -type d -exec chmod 775 {} \;
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache
这样您就可以让您的用户成为所有者并授予权限:1 执行,2 写入,4 读取 1+2+4 = 7 表示 (rwx) 2+4 = 6 表示 (rw) 最后,对于存储访问,ug +rwx 表示你给用户和组一个 7
问题解决了
php artisan cache:clear
sudo chmod -R 777 vendor storage
这启用了对应用程序,框架,日志的写权限希望这会有所帮助
对于 vagrant 用户,解决方案是:
(在 vagrant 中)php artisan 缓存:清除
(在 vagrant 之外) chmod -R 777 app/storage
(在流浪者中)作曲家转储自动加载
确保您在本地环境中而不是在 vagrant 中进行 chmod 在这里很重要!
使用 chmod -R 755 /var/www/html/test/app/storage
重试。在 chmod 中与 sudo 一起使用 Operation not permitted
。如果仍然有错误,请使用检查所有者权限。
根据我写这篇文章时最新的 Laravel 5.4,如果你有任何这样的问题,你需要更改权限。不要听任何人告诉你为任何目录设置 777。它有一个安全问题。像这样更改存储文件夹的权限
sudo chmod -R 775 storage
像这样更改引导文件夹权限
sudo chmod -R 775 bootstrap/cache
现在请确保您正在从应用程序目录执行这两个命令。您将来不会遇到有关许可的问题。 775 不会损害您机器的任何安全性。
建议正确的权限,如果是 Apache,
sudo chown -R apache:apache apppath/app/storage
对于使用 SELINUX 运行操作系统的任何人:允许 httpd 写入 laravel 存储文件夹的正确方法是:
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
然后立即应用更改:
sudo restorecon -F -r '/path/to/www/storage'
SELinux 可能很难处理,但如果它存在,那么我强烈建议您学习它而不是完全绕过它。
sudo semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/www/storage(/.*)?'
如果您有 Laravel 5 并且正在寻找永久解决方案,那么 php artisan
命令行用法和 Apache 服务器都可以使用:
sudo chmod -R 777 vendor storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo service apache2 restart
请参阅详细说明 here。
我遇到了同样的问题,以下步骤帮助我解决了这个问题。
找出 apache 用户 - 在 public 文件夹中使用代码创建了一个 test.php 文件
<?php echo exec('whoami'); ?>
并从网络浏览器运行该文件。它会给apache用户。就我而言,它是 ec2-user,因为我正在使用安装在 /etc/cron.d/ 中的 cronjob 的 aws。对于其他人来说,它可能是不同的用户。
在命令行上运行以下命令。
sudo chown -R ec2-user:<usergroup> /app-path/public
您需要在这里识别和使用正确的“用户”和“用户组”。
我遇到了同样的问题,但在 view
s 目录中:
file_put_contents(/var/www/app/storage/framework/views/237ecf97ac8c3cea6973b0b09f1ad97256b9079c.php): failed to open stream: Permission denied
我使用以下 artisan
命令解决了清理 view
缓存目录的问题:
php artisan view:clear
Xampp 使用:
cd /Applications/XAMPP/htdocs
chmod -R 775 test/app/storage
来自Setting Up Laravel 4.x on Mac OSX 10.8+ with XAMPP
每当我更改 app.php 时,我都会获得拒绝写入 bootstrap/cache/services.json 的权限,所以我这样做是为了修复它:
chmod -R 777 bootstrap/cache/
rm storage/logs/laravel.log
为我解决了这个问题
将权限设置为 777 绝对是个糟糕的主意!
... 但
如果您收到与“存储”文件夹相关的权限错误,这对我有用:
1) 使用 sudo chmod -R 777 storage/ 将“storage”及其子文件夹权限设置为 777 2) 在浏览器中转到 laravel 主页 laravel/public/ (laravel 将创建必要的初始存储文件) 3) 将安全 775 权限返回到 storage及其子文件夹 sudo chmod -R 775 storage/
如果使用 laradock,请在您的工作区容器中尝试 chown -R laradock:www-data ./storage
如果您使用 Linux 或 Mac,即使您也可以在 ssh terminal
中运行。您可以使用终端运行此命令,
php artisan cache:clear
sudo chmod -R 777 storage
composer dump-autoload
如果您使用的是 Windows,则可以使用 git bash
运行。
php artisan cache:clear
chmod -R 777 storage
composer dump-autoload
您可以下载 git 表单 https://git-scm.com/downloads。
在我的情况下,解决方案是更改对 app/storage/framework/views
和 app/storage/logs
目录的权限。
在对目录权限进行了大量试验和错误之后,我终于顿悟了……磁盘分区上没有剩余空间。只是想分享以确保没有其他人愚蠢到继续寻找错误方向的解决方案。
在 Linux 中,您可以使用 df -h
检查您的磁盘大小和可用空间。
这个问题实际上是由想要write/read
文件但被拒绝的不同用户引起的,导致不同的所有权。也许您之前以“root”身份安装了 laravel,然后您以“laravel”用户身份登录您的站点,其中“laravel”是默认所有权,所以这是这里真正的问题。因此,当用户'laravel'想要默认读取/写入磁盘中的所有文件时,被拒绝,导致该文件具有'root'的所有权。
要解决此问题,您可以这样做:
sudo chown -hR your-user-name /root /nameforlder
或者在我的情况下
sudo chown -hR igmcoid /root /sublaravel
脚注:
root 作为名称第一所有权,在 your-user-name 作为默认所有权之前安装,实际在站点中写入/读取。 namefolder 作为希望您更改所有权的名称文件夹。
如果其他人遇到与 fopen 文件权限错误类似的问题,但明智的做法是不要盲目地 chmod 777,这是我的建议。
检查您正在使用的命令以获得 apache 所需的权限:
fopen('filepath/filename.pdf', 'r');
'r' 表示以只读方式打开,如果您不编辑文件,则应将其设置为。这意味着 apache/www-data 至少需要对该文件的读取权限,如果该文件是通过 laravel 创建的,它将已经具有读取权限。
如果出于任何原因您必须写入文件:
fopen('filepath/filename.pdf', 'r+');
然后确保 apache 也有写入文件的权限。
http://php.net/manual/en/function.fopen.php
只需使用 artisian
启动您的服务器
php artisian serve
然后从指定的 URL 访问您的项目:
https://i.stack.imgur.com/Hrop8.png
在 mac 上运行 vagrant 时我遇到了同样的问题。通过在 https.conf 文件中更改 Apache 服务器的用户解决了这个问题:
# check user for php
[vagrant] ubuntu ~ $ php -i | grep USER
USER => ubuntu
$_SERVER['USER'] => ubuntu
[vagrant] ubuntu ~ $
在 php 用户而不是用户守护程序下运行 apache 以解决 php 文件访问问题
# change default apache user from daemon to php user
sudo sed -i 's/User daemon/User ubuntu/g' /opt/lampp/etc/httpd.conf
sudo sed -i 's/Group daemon/Group ubuntu/g' /opt/lampp/etc/httpd.conf
现在,php 创建的缓存文件可以被 apache 读取和编辑,而不会显示任何访问权限错误。
我在我的项目中遇到了同样的错误......但发现我忘了把 enctype 放在我的表单中。
<form method="#" action="#" enctype="multipart/form-data">
希望它以某种方式在某个地方有所帮助...
在使用 Laragon 和 Laravel 4 在 Windows 10 上工作时,在我看来无法手动更改权限,因为在 Laragon-in-built-terminal 中执行 chmod
-commands 没有任何效果。
但是,可以在此终端中转到存储文件夹并手动添加所需的文件夹,如下所示:
cd app/storage
mkdir cache
mkdir meta
mkdir views
mkdir sessions
终端中的 cd
-命令将您带到文件夹(您可能需要调整此路径以适合您的文件结构)。 mkdir
-命令将创建具有给定名称的目录。
我没有机会在 Laravel 5 中测试这种方法,但我希望类似的方法应该可行。
当然可能有更好的方法,但至少对于我的情况这是一个合理的解决方法(修复错误:file_put_contents(/var/www/html/laravel/app/storage/meta/services.json): failed to open stream
)。
首先,删除存储文件夹,然后再次创建存储文件夹。在存储文件夹中创建一个新的文件夹名称作为框架。在框架文件夹中创建三个文件夹名称,分别为缓存、会话和视图。
我已经通过这样做解决了我的问题。