为了进一步清晰而更新:
根据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,则可以是apache
或httpd
、www-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 服务器授予权限:使用chmod
和chown
执行chmod
666 或 777(不良文档/教程中此类问题的首选解决方案)可以神奇地使事情正常工作,但不安全。授予 666 或 777 权限将授予“其他人”访问权限。因此,不仅是 Apache,还有grandmother
( nsa
前提是这些用户帐户存在于您的计算机上 - 但实际上不存在,请避免这样做,除非只是为了测试/故障排除)。
最好更具体一些,只向您和 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/cache
并app/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 访问)。