Laravel 4: 打开流失败:权限被拒绝

36

我在设置 Laravel 4 时遇到了问题。打开索引页面时出现以下错误:

file_put_contents(/Users/laravel/app/storage/meta/services.json) [function.file-put-contents]:
无法打开流进行写入: 权限被拒绝。

我漏掉了什么?

6个回答

52

我认为chmod -777是一种不好的做法。

为了解决Laravel中的权限问题,我用root用户执行了以下操作:

cd app/

chown -R www-data:www-data storage

cd storage/

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

并且总是在app/storage目录下执行以下操作:

chown your_user:user_group .gitignore cache/.gitignore logs/.gitignore meta/.gitignore sessions/.gitignore views/.gitignore

现在,退出root用户,一切都没问题了。

编辑:这是针对Laravel4的。对于Laravel5,由于结构不同,此方法不可行。


谢谢,这很有帮助。只是为了提供更多信息,在OSX 10.9中,Apache(随OSX一起提供的Apache)的默认用户和组是_www和_www,因此我执行了chown -R _www:_www storage/。 - jonprasetyo
只有 Laravel 5 的更改是您不需要先执行 cd app 命令,最后一个命令应该是 chown vagrant:www-data .gitignore framework/cache/.gitignore logs/.gitignore app/.gitignore framework/sessions/.gitignore framework/views/.gitignore - Simon
可能使用chmod比使用find更容易:chmod -R ug=rwX,o=r app/storage - antonbormotov

46

storage目录需要由Web服务器用户具有写入权限。


5
我可以帮您进行翻译。这句话的意思是:“我该怎么做?需要用到chmod吗?”请注意,我的翻译尽可能保持了原文的意思和语气,并简化了表达方式。 - Bryan P
8
我必须先使用777,然后回归到755才能使其正常工作。我无法让644正常工作。 - Dynelight
而bootstrap目录,在我的情况下 - Mladen Janjetovic

15

最好不要更改权限,你只需要使用 chown 将存储文件夹的 owner:group 更改为 apache 的 owner:group。这样更加复杂,但更加安全,而且很快你就会习惯,你可以在 httpd.conf 中找到此设置。

MAMP:

/Applications/MAMP/conf/apache/httpd.conf

XAMPP:

/Applications/XAMPP/xamppfiles/etc/httpd.conf
使用您喜欢的编辑器打开httpd.conf文件,然后搜索。在搜索之后,您将看到以下突出显示的行:
User someuser
Group somegroup

一旦你已经知道用户和组,cd到你的Laravel目录,然后执行chown命令:

chown -R someuser:somegroup app/storage

附言: 如果你在执行 chown 命令时出现了一些错误,请尝试这样做:

sudo chown -R someuser:somegroup app/storage

然后它会要求输入您的密码,输入后完成。


在Debian 7中,您应该更改/etc/apache2/envvars中的用户/组,然后更改/var/lock/apache2的所有权。我想在其他基于Debian的Linux中也应该类似。 - Salvador P.

5

我在CentOS 7上遇到了这个问题。阻碍并不是文件夹权限,而是SELinux策略阻止了Nginx/PHP访问/var/www。因此,如果以上方法不起作用,请尝试禁用SELinux以进行测试,看看是否可以重新运行Composer而没有任何权限问题。


4
我花了将近一整天的时间才想明白。这里有一个关于该程序更多信息的链接,同时也提供了如何禁用它的方法。快速参考命令为: setenforce 0 - Drellgor
3
不要禁用selinux。你可以在这里解决你的问题:https://dev59.com/RGMl5IYBdhLWcg3w_rOD#27377624。 - Sky

1
如果您在Ubuntu上使用Apache,存储和bootstrap/cache文件夹需要由Web服务器用户具有写入权限。
sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

这将允许Web服务器用户对这些文件夹拥有写入权限。

0
在我的情况下,抛出了以下错误:

fopen(php://stdout): failed to open stream: operation failed

我正在使用Wamp中的虚拟主机。因此,我在httpd-vhosts.conf文件中的<VirtualHost> -> <Directory>块中添加了这行代码:
Require all granted

我的代码块是:

<VirtualHost *:80>
    ServerName laravel
    DocumentRoot d:/wamp/www
    <Directory  "d:/wamp/www/">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

那问题就解决了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接