【问题标题】:Apache can't write to pathApache 无法写入路径
【发布时间】:2015-04-10 16:53:51
【问题描述】:

概述

我正在使用具有图像上传功能的 Laravel 4.2。我在 Homestead 上设置了它,但最近我删除了 Nginx 并使用 Apache 来服务该站点(由于需要使用服务器发送事件)。

在我从 Nginx 迁移到 Apache 之前,文件上传功能运行良好。它也可以在带有 Apache 的登台服务器上正常工作。

错误

我正在使用干预图像库来处理图像上传。当我尝试上传文件时,我的laravel.log 文件中出现以下内容:

Can't write image data to path (/home/vagrant/projects/projectname/public/assets/pics/profile/photos/f55f0ae2-2d1a-4fdd-b9be-39d8a509baa3.jpg)

我的尝试

我以为这只是一个简单的权限错误。我已经将chmod 我的asset 目录更改为0777,将目录所有者更改为www-data,使用www-data 创建一个名为web 的新组并将所有者组更改为那个, (基本上this answer 中的所有内容以及更多内容)仍然无法正常工作。

该目录确实存在,并且就像我提到的那样,它在迁移到 Apache 之前就已经工作了(我不完全确定它是否相关,但似乎很有可能)。

我的/var/log/apache2/error.log 也是空的。

暂存服务器工作正常,但我不希望在配置生产服务器时遇到同样的问题。我想解决这个问题并更多地了解它,以便将来遇到它时可以解决它。为什么会发生这种情况,我该怎么做才能进一步修复/调试?

文件夹权限示例

drwxr-xr-x 1 vagrant vagrant  272 Jan 26 11:07 assets/pics
drwxr-xr-x 1 vagrant vagrant  170 Jan 26 10:11 assets/pics/defaults
drwxr-xr-x 1 vagrant vagrant  714 Jan 26 14:10 assets/pics/forums
drwxr-xr-x 1 vagrant vagrant  646 Jan 26 14:10 assets/pics/forums/thumbs
drwxr-xr-x 1 vagrant vagrant  170 Jan 20 18:02 assets/pics/gallery
drwxr-xr-x 1 vagrant vagrant 3026 Jan 26 13:24 assets/pics/messages
drwxr-xr-x 1 vagrant vagrant 2992 Jan 26 13:24 assets/pics/messages/thumbs
drwxr-xr-x 1 vagrant vagrant  136 Jan  8 17:27 assets/pics/profile
drwxr-xr-x 1 vagrant vagrant  136 Feb 10 14:48 assets/pics/profile/photos
drwxr-xr-x 1 vagrant vagrant  102 Feb 10 14:51 assets/pics/profile/photos/thumbs

由于某种原因,所有者/组仍然是 vagrant,即使我 chown 他们。我试过sudo chownsudo -s

【问题讨论】:

  • 只是为了确保您在assets 目录上运行chmod 和/或chgrp 时确实使用了-R(递归)选项?因为子目录也需要相同的权限。尝试运行 cd /home/vagrant/projects/projectname/public && ls -dl `find assets/ -type d` 并发布输出。
  • 你检查过具体的文件夹权限吗? /home/vagrant/projects/projectname/public/assets/pics/profile/photos/ 在我认为递归 chmod 已更改其所有子目录的权限之前,我遇到过一个非常相似的问题,但仍有一些落后者。有时,如果另一个系统用户创建了自己的目录或文件,它也有自己不同的默认权限。如果您能找到该用户,请将 Apache 添加到其组中。
  • @Bogdan @cchapman900 我已经更新了我的问题以包含文件夹权限输出。由于某种原因,所有者仍然是vagrant...

标签: php apache laravel nginx permissions


【解决方案1】:

尝试修改您的 Vagrantfile 以在 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| 块结束之前包含此行:

config.vm.synced_folder "/path/to/laravel/app", "/home/vagrant/projects/projectname", :owner => "www-data", :group => "www-data", :mount_options => ["dmode=775", "fmode=664"]

字符串"/path/to/laravel/app" 必须指向您在Vagrant 机器外工作的目录。这应该强制文件所有者和权限是您为所有项目文件指定的那些(因此它们不会被 vagrant 覆盖)。进行更改后,您需要重新启动 VM。

【讨论】:

  • 是的,完美!谢谢!
【解决方案2】:

你的chown怎么样?应该是

chown USERNAME GROUP -R /path/to/file

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 2014-09-30
    • 2013-11-10
    • 2018-01-30
    • 2017-02-26
    • 2018-10-05
    • 2018-06-29
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多