【问题标题】:PHP - include using $_SERVER['DOCUMENT_ROOT'] gives permission denied although its 777?PHP - 包括使用 $_SERVER['DOCUMENT_ROOT'] 给出的权限被拒绝,尽管它的 777?
【发布时间】:2014-08-09 06:27:54
【问题描述】:

我正在尝试获取我的应用程序的根目录以包含从它开始的文件.. 我用这个

include_once $_SERVER['DOCUMENT_ROOT'].'/includes/myfile.php'

它显示这个错误:

Warning: include_once(/usr/local/apache/htdocs/includes/db.php) [function.include-once]: failed to open stream: Permission denied .....etc

警告:include_once() [function.include]: 未能打开 '/usr/local/apache/htdocs/includes/myfile.php' 以包含 (include_path='.:/usr/lib/php:/usr/ local/lib/php') 在 /home/usernamehere/public_html/includes/parentfile.php 第 14 行

但是当像这样使用 $_SERVER['SCRIPT_FILENAME'] 的一部分(等于'/home/username/public_html/parentfile.php')时:

include_once '/home/username/public_html/includes/myfile.php';

它可以正常工作,没有错误。

这是服务器管理员方面的权限问题吗?或者我可以自己解决?

【问题讨论】:

  • 你走过目录路径了吗?
  • 没听懂,“走路”是什么意思?
  • 即检查 /usr/, /usr/local/ ...的权限/所有权/组...
  • 是的,我做到了,文件夹“包含”有 777 权限。
  • @Dabbas 刚刚发布了一个答案。您看到的错误消息中的详细信息很清楚。 $_SERVER['DOCUMENT_ROOT'] 适用于整个 Web 服务器,但不适用于每个用户 public_html 目录。

标签: php include


【解决方案1】:

这不起作用,因为它:

include_once $_SERVER['DOCUMENT_ROOT']  . '/includes/myfile.php';

$_SERVER['DOCUMENT_ROOT'] 指的是 Web 服务器本身的绝对 Web 服务器主文档根。不是per-user public_html web directories。这就是为什么这样做:

include_once '/home/username/public_html/includes/myfile.php';

这是服务器管理员方面的权限问题吗?或者我可以 从我那里解决?

1,000,000% 没有。这只是了解服务器上的路径是什么以及为什么。

另外,777 权限是可怕的和安全风险。如果您认为需要解决此类问题的第一个想法就是转至chmod 777,那么您并没有解决问题并造成安全风险。

777 表示 100% 的任何人都可以读取、写入或执行该文件。而在 Apache 下运行的 PHP 则不需要这样做。

对于 PHP 文件,它可以是 664644,因为不需要执行 PHP 文件。它们只需要被文件系统读取,然后被 Apache PHP 模块解析。

也就是说,如果您想简化文件加载方式,您应该像这样显式设置$BASE_PATH

$BASE_PATH = '/home/username/public_html/';

然后像这样设置你的include_once

include_once $BASE_PATH  . 'includes/myfile.php';

自动为安装设置文件路径的方式永远不会奏效。最好只是在移动代码时在配置文件中手动设置$BASE_PATH,而不是处理诸如$_SERVER 之类的PHP 常量在安装、设置和配置之间不一致所带来的麻烦。

【讨论】:

  • 所以我应该总是尝试获取'/home/username/public_html/',你有什么好的方法吗?
  • @Dabbas 是的。阅读我发布的内容。你永远不会自动化这个过程。只需设置一个基本路径。
【解决方案2】:

文档根是在 apache 中设置的。如果配置不正确,您的文档根目录可能位于其他位置。

话虽如此,您应该查看地图所有权。 Apache 在一组用户下运行。如果您的用户无权访问特定文件夹(即用户 root,可能不是您的 apache 用户),您将无权访问。

777 不是包含所必需的,甚至不推荐用于 apache 有权访问的文件夹。 776 应该是权利的绝对最大值。

【讨论】:

  • “776 应该是权利的绝对最大值。”对于 PHP 文件,它可以是 664644,因为不需要执行 PHP 文件。它们只需要被 Apache PHP 模块读取和解析。
  • 是的,先生,我明白了。但该最大值用于上传文件夹。这是为了重复777更糟糕的事实。不过谢谢你的评论。
  • 776 只是目录不需要。您可以使用775755
猜你喜欢
  • 2015-04-23
  • 2014-01-27
  • 2012-05-03
  • 1970-01-01
  • 2011-10-19
  • 2022-01-02
  • 2018-08-21
相关资源
最近更新 更多