授予 PHP 写入文件和文件夹的权限

授予 PHP 写入文件和文件夹的权限

为了进一步清晰而更新:

根据http://expressionengine.com/user_guide/installation/installation.html, 它说:

对于大多数 Unix 主机,以下是典型的,但您可以咨询您的主机,看看是否可以使用更严格的权限允许 PHP 写入文件 (666) 和文件夹 (777)。在 Windows 服务器上,以下内容不适用,但您需要确保文件和文件夹可由 ExpressionEngine 写入。您可能需要为此联系您的房东。

不知道这意味着什么。我可以将特定文件和文件夹分别更改为 666 和 777,我是 chown'er,但上面听起来我也需要允许 PHP 执行此操作?

原问题:

我需要确保 PHP 可以写入特定文件 (666) 和文件夹 (777)。

我该怎么做呢?

答案1

我将通过技术解决方案来完成 rahmu 和 MV 的答案。以下所有内容仅适用于类 UNIX 系统。

滚动浏览 chmod/chown 部分,查看使用 ACL 的示例 - 比 UNIX 文件模式更强大的工具。

查找您的网络服务器用户名

首先,您需要知道您的网络服务器运行的用户名。如果您使用的是 Apache,则可以是apachehttpdwww-data等。在大多数类似 Debian 的系统上,Apache 是www-data。对于nginx来说,一般也是www-data

要检查它,请尝试:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

确保此命令返回的用户名是一致的(例如,我 99% 的时间都使用 nginx,但此命令返回tomcat7,我安装过一次的 Java Web 服务器)


向 Web 服务器授予权限:使用chmodchown

执行chmod666 或 777(不良文档/教程中此类问题的首选解决方案)可以神奇地使事情正常工作,但不安全。授予 666 或 777 权限将授予“其他人”访问权限。因此,不仅是 Apache,还有grandmothernsa前提是这些用户帐户存在于您的计算机上 - 但实际上不存在,请避免这样做,除非只是为了测试/故障排除)。

最好更具体一些,只向您和 Apache 授予权限。更改文件组,将文件的完全控制权交给 Web 服务器。为此,请递归地更改所有者:

chown -R www-data:www-data your/folder/

但最有可能的是,您可能希望仅通过更改组来保持对文件的完全访问权限:

chown -R yourusername:www-data your/folder/

然后,执行适当的操作chmod以授予该组www-data与您相同的权限。例如,如果当前模式是 640(6代表你,4代表www-data,0代表其他,翻译为-rw-r-----),将其设置为 660(6代表你,6代表www-data,0代表其他,翻译为-rw-rw----)。请参阅 rahmu 的答案以了解有关文件模式的更多信息,这是一种古老但优雅的机制。

为了避免使用 操作神秘的数字chmod,您还可以使用以下语法:

chmod -R g+rw your/folder/

它的意思是“向组(g)添加(+)对文件夹 的读写(rw)权限your/folder/,递归地(-R)”。

在 90% 的情况下,这应该足够了。


我的首选方法:使用 ACL(访问控制列表)

有时第一个解决方案是不够的。我将举个例子交响乐框架记录并缓存大量数据。因此它需要对适当文件夹的写权限。

当您在 CLI 中并行使用 Symfony 控制台(在我的用户帐户下)和 Web(Web 服务器用户)时,chmod/方法可能还不够。chown这会导致很多问题,因为 Symfony 不断修改权限。

在本例中,我们将使用 ACL(访问控制列表),这是在许多 UNIX 系统上管理权限的更高级方法。

这里是 Symfony 官方文档给出的命令(请更改app/cacheapp/logs根据您的需要):

在支持的系统上chmod +a(即非 Debian/Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

在不支持的系统上chmod +a(最常见)

您将需要该setfacl工具;也许它是默认安装在您的系统上的,因此请尝试setfacl -v查看该命令是否可用。

如果该命令不可用,如果您使用的是 Ubuntu 14.04+,您只需安装该工具:

sudo apt install acl

否则,请遵循操作系统文档,因为您可能需要更改分区的安装方式(Ubuntu 文档在这里)。

我们就在那里:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

我对这种方法从来没有任何问题,满意或退款。

答案2

无论文件的所有者是谁,666 权限和 777 就足够了:最后一个数字确保每一个系统上的用户具有访问权限。虽然这是最简单的方法,但由于确切原因,它绝对不是最安全的。

更好的方法

您需要了解的第一件事是Unix 权限如何工作。为了理解我在此链接中给出的答案,请注意权限可以转换为数字:

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

那么Achmod 666相当于将权限更改为rw-rw-rw.

接下来,您必须找出正在执行 PHP 脚本的用户。通常,这将是运行您的 Web 服务器的用户。这是如何执行此操作的示例(您可以将 Apache 替换为您的 Web 服务器的名称)。

一旦您知道执行脚本的用户以及您提到的文件的所有者,您就可以设置适当的权限。请记住,授予写入权限(甚至读取权限)每一个您系统上的用户可能会造成灾难性的后果。

答案3

Expression Engine 就像许多其他 PHP Web 应用程序一样,需要对某些文件和目录进行读+写访问。例如,EE 需要对其 config.php 和 database.php 文件的写访问权限,以及对其文件上传目录的写访问权限。

文档说明的是,由于大多数服务器将 PHP 作为 mod_php 运行(因此以 Web 服务器的权限运行),并且您可能会使用自己的用户通过 FTP(或类似的)上传文件,这些文件和目录需要被授予权限 666(每个人都可以读和写)和 777(每个人都可以读、写和浏览)。

这不是最安全的方法,但肯定是最简单的方法,特别是如果您使用托管服务。

但是,正如 EE 说明所述,请询问您的托管提供商,因为有些不使用 mod_php,而是使用 fastcgi、suphp 或其他版本。这些服务器以您自己的用户身份运行 PHP,因此 PHP 以及 EE 脚本创建的任何文件都可以读取和写入您上传的所有文件。在这种情况下,需要为 PHP 访问的文件和目录授予 600 和 700 访问权限。由 Web 服务器(而不是 PHP 运行时)直接访问的其他文件仍需要 666 和 777 访问)。

相关内容