【问题标题】:services.json failed to open stream: Permission denied in Laravel 4services.json 无法打开流:Laravel 4 中的权限被拒绝
【发布时间】:2013-07-31 01:09:55
【问题描述】:

我正在玩一个可以运行的 Laravel 4 安装,并将所有内容都移到一个子文件夹中。然后我决定不这样做,我将它全部移回(全部通过命令行):

mv * /folder

然后

cd folder
mv * ../

现在,该网站抛出以下错误:

file_put_contents(/var/www/quantquote/app/storage/meta/services.json): failed to open stream: Permission denied

这是完整错误的截图:

http://i.imgur.com/8deGG97.png

我已经尝试将 /storage 文件夹的权限设置为 777 无济于事。

【问题讨论】:

  • chmod -R 0777 app/storage 应该不错...
  • 又试了一次,还是没有效果:(
  • 尝试同时运行find app/storage -type d -exec chmod 777 {} \;find app/storage -type f -exec chmod 777 {} \;
  • @CollinHenderson 做到了,谢谢。你能解释一下这是做什么的吗?
  • 这些命令将app/storage下所有目录和文件的权限更改为777

标签: laravel laravel-4


【解决方案1】:

花了一整天的时间解决这个问题,这个命令简单地解决了我的问题。

如果您对 Laravel App 文件夹的权限为 777,但您仍然收到此错误,那是因为 SEliux 已阻止它。您可以使用以下命令轻松取消阻止应用程序的文件夹:

su -c "chcon -R -h -t httpd_sys_script_rw_t /usr/share/nginx/YOUR_LARAVEL_APP/"

就是这样!

顺便说一句,永远不要禁用 SElinux:http://stopdisablingselinux.com/

【讨论】:

  • 非常感谢!我想补充一点,我的命令最终是chcon -R -h -t httpd_sys_script_rw_t /var/www/laravel,因为我已经在以 root 身份运行的本地计算机上,以防其他人模糊地睡眠不足并且无法正确阅读内容。再次感谢!
  • 这是对 Laravel 和日志记录的许多问题的答案。感谢那。节省了一天的调试时间
【解决方案2】:

正如我在评论中所说:

find app/storage -type d -exec chmod 777 {} \;

find app/storage -type f -exec chmod 777 {} \;

这会将app/storage中的所有目录和文件chmod为777。

【讨论】:

  • 我会将权限设置为 775 而不是 777,并相应地配置文件所有权和组。即 web 服务器的组和 app/storage 文件夹将是相同的。
  • 作为安全预防措施,我建议chmod -R ug+rwX,o-rwx . 这将设置目录仅执行,并防止组外的人对您的文件做可怕的事情。
  • 要阅读如何以正确的方式设置目录权限,请查看以下答案:stackoverflow.com/a/37266353/987864
【解决方案3】:

由于问题与权限有关,请尝试重新授予app/storage 及其所有子目录和文件的正确权限。

您可以从 Laravel 应用程序的根路径输入:

chmod -Rvc 777 app/storage

如果由于某种原因这不起作用,请尝试:

find app/storage -type d -exec chmod -vc 777 {} \;
find app/storage -type f -exec chmod -vc 777 {} \;

【讨论】:

  • 如果您不赞成这个答案,请提供任何解释,以便我们改进它。谢谢。
  • 投反对票:永远不要使用 chmod 777 ! SO应该禁止提出这样一个危险的命令作为解决方案。
  • @ЕлинЙ。你会推荐什么?
【解决方案4】:

如果您使用的是 CentOS7,请按照以下步骤操作:

  1. 更改应用/存储目录所有权

    chown apache:apache app/storage
    
  2. 更改应用/存储权限

    chmod -R 775 app/storage
    
  3. 防止 SELinux 阻塞 app/storage 目录

    su -c "chcon -R -h -t httpd_sys_script_rw_t [fullpath]/app/storage"
    

【讨论】:

    【解决方案5】:

    当 chmod 777 或 chmod 775 失败时,检查子目录是否真的存在:

    app/storage/
    ├── cache
    ├── logs
    ├── meta
    ├── sessions
    └── views
    

    如果这些文件夹不存在,您必须创建它:

    cd app/storage/
    mkdir meta logs cache sessions views
    cd ../
    find storage -type d -exec chmod 775 {} \;
    find storage -type f -exec chmod 664 {} \;
    

    2016 年更新 laravel 5+

    在默认的 Laravel 5+ 应用程序结构中,storageapp 处于同一级别。所以前面的命令就变成了:

    cd storage/
    mkdir meta logs cache sessions views
    find . -type d -exec chmod 775 {} \;
    find . -type f -exec chmod 664 {} \;
    

    https://laravel.com/docs/5.0/structure

    【讨论】:

    • 这个答案对我有帮助,我需要在 storage 文件夹下创建文件夹结构。但就我而言(对于 Laravel 5.0),视图、会话和缓存文件夹必须位于名为“framework”的子文件夹中。
    【解决方案6】:

    只需在终端上输入:

    php artisan cache:clear
    

    【讨论】:

    • 救了我的命。 -_-
    【解决方案7】:

    永远不要在递归模式下运行 777。这是一个安全问题。 现在,删除 services.json 文件,然后试试这个:

    Laravel 4: Failed to open stream: Permission denied

    【讨论】:

    • 请把链接里的相关部分贴出来,如果链接失效了,以后的回答就没有用了。
    【解决方案8】:

    一一尝试这些命令:

    setenforce 0
    setsebool -P httpd_can_network_connect_db on
    

    【讨论】:

    • 为什么这个没有投票?这就像一个魅力! :D 谢谢!
    • 因为它禁用了 SELinux,而不是学习如何使用它,这是一个危险的建议。此外,发帖人实际上并没有解释这个“解决方案”在做什么。
    猜你喜欢
    • 2013-06-05
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2019-09-06
    • 2019-05-02
    • 2018-06-27
    • 2018-10-20
    相关资源
    最近更新 更多