PHP警告:未知错误:无法打开流

72
我最近编辑了apache httpd.conf文件以使mod_rewrite工作。我不知道这个问题是否起源于此,但从那天起我就一直遇到这个问题。
当我运行该软件时,前端显示如下内容:

服务器错误 - 访问http://localhost/prestashop/时遇到错误。可能正在进行维护或配置不正确。

没有特定的文件会触发此问题。但我发现通常由4-5个php文件组成的小程序可以正常运行,而像PrestaShop这样具有大量文件的软件则无法正常运行。
我检查了日志,找到了以下内容。
[Wed Mar 16 19:33:39 2011] [error] [client ::1] PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
[Wed Mar 16 19:33:39 2011] [error] [client ::1] PHP Fatal error:  Unknown: Failed opening required '/var/www/html/yomig/index.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0
[Wed Mar 16 19:33:39 2011] [error] [client ::1] File does not exist: /var/www/html/favicon.ico
[Wed Mar 16 19:33:41 2011] [error] [client ::1] PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
[Wed Mar 16 19:33:41 2011] [error] [client ::1] PHP Fatal error:  Unknown: Failed opening required '/var/www/html/yomig/index.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0

您的网站根目录是:/var/www/html/yomig/ 还是 /var/www/html/?看起来您可能已经通过配置更改破坏了网站根目录。在 index.php 中指定了哪些包含文件?它们使用相对路径还是绝对路径? - Canuteson
我的网站根目录是/var/www/html/yomig,并且index.php文件中没有包含任何文件。 - Bibhas Debnath
@AbiusX 请再多解释一下。 - Bibhas Debnath
1
我认为他在暗示Web服务器可能没有读取“index.php”文件的访问权限。 - Jeff Parker
嘿,文件夹的chmod为755 -R,但仍然没有运气。 :-/ - Bibhas Debnath
显示剩余2条评论
18个回答

155

我也遇到过相同的错误,原因是我在Mac上将DocumentRoot更改为我的用户Sites目录。

要解决这个问题,我运行了递归命令以确保Apache服务具有读取权限。

sudo chmod -R 755 ~/Sites

@John,我给你点赞,因为你的答案对我也有用...不过,我有点困惑,为什么这个应该是755...我的主机(生产服务器)使用644也能正常工作,而且我一直认为将操作系统用户添加到Web文件夹中是正确的方法。 - itsols
这是由于此目录的所有者/组设置方式造成的。 - John Magnolia
我已经开始为这个常见的错误制作故障排除清单,链接在这里:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew
2
“755”是完全过度的,而且可以说是不安全的:您不希望每个目录都可以被全球读取,并且给每个文件赋予执行权限是过度的。就您的确切错误消息而言,您只需要chmod 644 /var/www/html/yomig/index.php。请参见@Dexter的正确/安全递归命令的答案:https://dev59.com/Vm435IYBdhLWcg3wlRMf#26918548 - user664833

35

如果您正在运行 Fedora,请确保 SELinux 没有干扰。您可以使用以下命令来解决这个问题:

您可以使用以下命令来解决这个问题:

setsebool -P httpd_can_network_connect 1
    sudo /sbin/restorecon -R /var/www/

更多信息请访问:linuxquestions.org/questions/linux-server-73/


1
不是非常有用的评论。修复方式如sudo /sbin/restorecon -R /var/www/。更多信息请参见此处:http://www.linuxquestions.org/questions/linux-server-73/apache-2-warning-unknown-failed-to-open-stream-permission-denied-814037/。 - Christof

11

我曾经遇到过同样的错误,原因是文件权限不正确。

chmod 755 index.php

对我有用。


我已经开始为这个频繁出现的错误制作故障排除清单,链接如下:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew

6
以下是如何解决此问题的指南。前往:
cd /var/www

sudo chown www-data:www-data * -R

sudo usermod -a -G www-data username

请用你的用户名替换"userneme"。希望这有所帮助。


6

这是一个SELinux阻止httpd访问的问题。以下是解决方案:

# restorecon '/var/www/html/wiki/index.php'
# restorecon -R '/var/www/html/wiki/index.php'
# /sbin/restorecon '/var/www/html/wiki/index.php'

4

我刚遇到了同样的问题,而且是由于selinux引起的。禁用它解决了这个问题。不需要在我的工作站上使用selinux,谢谢。


4

在我看来,真正的方法是:

# add READ permission to all directories and files under your DocumentRoot
sudo chmod +r /path/to/DocumentRoot/ -R

# add EXECUTE permission to all DIRECTORIES under your DocumentRoot
find /path/to/DocumentRoot/ -type d -exec chmod +x {} \;

用户www-data也应该获得一些权限吗?我会运行 chmod g+r /path/ -R && chown $USER:www-data /path/ -R - rubo77
@Dexter:+X(大写X)是一种更好的只影响目录的方式。但它可能不在所有chmod版本中可用。因此,实际上,根据您的chmodsudo chmod +rX /path/to/DocumentRoot/ -R可能会起作用。 - 0xC0000022L
我已经在这里为这个常见的错误开始了一个故障排除清单:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew

4

当我将错误的文件地址插入到.htaccess中时,出现了这个问题。

php_value auto_prepend_file "/home/user/wrong/address/config.php"

如果你使用了 auto_prepend_file,请检查你的文件路径。它会被从 .htaccess 中调用,因此 PHP 无法确定错误文件和行数。


2
今天我遇到了与/home/user/public_html/index.php有关的问题,解决方法是执行chmod o+x /home/user,因为这个目录必须具有X权限,否则Apache服务器无法列出文件(即执行ls命令)。

1
x 提供遍历权限。 r 提供读取权限(但没有 x 就不能读取)。 - MikeyB
我已经开始为这个常见的错误制作故障排除清单,链接在这里:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew

1
如果您忘记了创建一个指向不同目录的Windows符号链接,并且该目录没有适当的权限,那么这种情况也会发生(并且特别令人困惑)。

我已经开始为这个常见的错误制作故障排除清单,链接在这里:stackoverflow.com/a/36577021/2873507 - Vic Seedoubleyew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接