Apache 仍在以不正确的权限提供 PHP 文件

Posted

技术标签:

【中文标题】Apache 仍在以不正确的权限提供 PHP 文件【英文标题】:Apache still serving PHP file with incorrect permissions 【发布时间】:2017-03-30 17:03:21 【问题描述】:

我试图理解为什么在我设置权限 000 并赋予文件根所有权之后 Apache 仍然能够提供 php 文件。

如果我创建一个权限为 644 的网络服务器所拥有的 PHP 文件,则它的服务正确。如果我随后将权限更改为 000 并将所有权更改为 root,则仍会提供该文件,但我认为不应该这样做!

如果我然后重新启动 Apache,则不会提供该文件。我得到一个 500 并且错误日志抱怨无法打开文件,这正是我所期望的行为。

重新启动后,当文件没有被提供时,如果我将所有权改回网络服务器并将权限改回 644,则再次提供文件,而无需重新启动 apache。

此行为仅适用于 PHP 文件。 html 文件的行为与我预期的一样,一旦您删除权限,文件就不会被提供。

有人向我建议 Apache 可能正在维护 PHP 文件的文件句柄,并且在重新启动之前它看不到权限更改。我尝试在文件上使用 lsof,但没有看到任何打开的文件描述符。

我还尝试并试验了从网络服务器所有权和 644 权限开始的地方,并检查了可以提供文件。然后我重命名了文件,将权限更改为 000 并将所有权更改为 root,然后将文件移回。在此之后,该文件仍然由 Apache 提供。

谁能解释这里发生了什么?

【问题讨论】:

用这个做实验:修改前后访问my.hostname/index.php,如果第二个请求失败则访问my.hostname/index.php?itok=randomnumbers,然后缓存。 您确定该网站不是从缓存中提供的吗? @apokryfos 我已经检查过了,它绝对没有缓存。我已更改脚本以秒为单位显示时间并显示查询字符串。我在帖子中描述的测试结果是相同的,并且时间正在更新,并且正在显示查询字符串(我每次都会更改)。 【参考方案1】:

最有可能发生的事情是您正在运行 opcache。 PHP 在运行时自行编译。为了节省开销,PHP 5.5 或更高版本有Opcache,它节省了编译步骤。所以 Apache 可能正在缓存文件。然后,Apache 将使用自己的权限存储缓存文件。 Apache 也可能将其缓存在内存中。当您重新启动 Apache 时,它​​必须返回到它不再有权访问的基本 PHP 文件。

【讨论】:

是的,刚刚检查并运行。我不认为它已安装。 使用 opcache.enable=0 双重检查了我的所有结果,它按我的预期工作 - 拒绝访问具有 000 权限的文件。谢谢

以上是关于Apache 仍在以不正确的权限提供 PHP 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何为apache提供cmd权限?

本地开发,Apache vs Developer - 文件权限

Php 错误:无法打开流:CentOS 7.1.1503(核心)中的权限被拒绝

为啥 Apache + PHP 需要执行权限才能写入文件?

php apache用户写文件夹权限设置

Apache 权限,PHP 文件创建,MKDir 失败