【问题标题】:Why DOCUMENT_ROOT is different than realpath('.') on remote server为什么 DOCUMENT_ROOT 与远程服务器上的 realpath('.') 不同
【发布时间】:2011-03-12 08:34:14
【问题描述】:

echo realpath('.').'<br>';
echo dirname(__FILE__).'<br>';
echo realpath(dirname(__FILE__)).'<br>';
echo $_SERVER[PHP_SELF].'<br>'; 
echo getcwd();

我总是得到

/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public

但在 phpinfo DOCUMENT_ROOT 是

/services/webpages/l/i/mydomain.com/public

因为我很难将 .htaccess 与 Zend Framework 结合使用。

在我的本地,我可以让它工作。但是在提供者主机上我还不能掌握魔法。

EDT:我将$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']); 放在索引文件中,但得到了这个。

致命错误:未捕获的异常 'Zend_Config_Exception' 带有消息 'parse_ini_file(/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/v0.2b/application/configs/appkeys .ini)[function.parse-ini-file]:无法打开流:没有这样的文件或目录 parse_ini_file(/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/ v0.2b/application/configs/appkeys.ini)[function.parse-ini-file]:无法打开流:/services2/webpages/util/i/g/gg8375620.provider.com 中没有这样的文件或目录.br/mydomain.com/public/v0.2b/library/Zend/Config/Ini.php:181 堆栈跟踪:#0 /services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain。 com/public/v0.2b/library/Zend/Config/Ini.php(201): Zend_Config_Ini->_parseIniFile('/services2/webp...') #1 /services2/webpages/util/i/g/gg8375620 .provider.com.br/mydomain.com/public/v0.2b/library/Zend/Config/Ini.php(125): Zend_Config_ in /services2/webpages/util/i/g/gg8375620.provider.com.br /mydomain.com/public/v0.2b/l ibrary/Zend/Config/Ini.php 在第 181 行

美国东部时间: 就是这个:

$appkeys = new Zend_Config_Ini(APPLICATION_PATH . '/configs/appkeys.ini');

而 APPLICATION_PATH 由

定义
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

【问题讨论】:

  • DOCUMENT_ROOT 真的以现在的形式工作吗?
  • 是的。这就是它的工作方式。不知道 Zend 为什么要尝试真实路径以及为什么还会出现错误。
  • 能否请您添加产生此错误的实际代码?你知道,很难预见它。

标签: php zend-framework .htaccess


【解决方案1】:

试试这个:

$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']);
echo $_SERVER['DOCUMENT_ROOT'] . "\n";

阅读this

【讨论】:

  • 我明白了。谢谢!但是zend造成的地址转换差异呢?还是我可以强制 htaccess/zend 总是只给出其中一个?关键是 PHP 只会看到 /services/webpages/l/i/mydomain.com/public。 realpath 只是抛出一个在 php 上找不到的文件。
  • 如果你写这个$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']);,ZF 必须始终使用这个地址,在.htaccess 中你不能修改 DOCUMENT_ROOT 但在服务器配置中可以!
  • 很多时候我不碰php。我很迷茫。刚刚添加了一个 EDT,但我仍然遇到错误。
【解决方案2】:

可能是您的DOCUMENT_ROOT 中的某些目录实际上是symlinks 到其他目录-引用the documentation

realpath() 扩展所有符号链接并解析输入路径中对“/./”、“/../”和额外“/”字符的引用,并返回规范化的绝对​​路径名。

因此,如果(例如)/services/webpages/l 是一个目录,/services/webpages/l/i 是一个指向 /services2/webpages/util/i/g/gg8375620.provider.com.br 的符号链接,/services2/webpages/util/i/g/gg8375620.provider.com.br/mydomain.com/public/services/webpages/l/i/mydomain.com/public 都会将您带到同一个目录,但是 realpath( ) 将始终返回前者。

/services
 + webpages
 | - util
 |   - i
 |     - g 
 |       - gg8375620.provider.com.br
 |         - mydomain.com
 |           - public
 + l
   - i -> ../webpages/util/i/g/gg8375620.provider.com.br/

【讨论】:

  • @downvoter:需要解释一下吗?尽管符号链接对您来说可能看起来很神奇,但我向您保证它们有效,并且 realpath() 将取消引用它们。
  • 不要误会我的意思。我们从之前的状态中知道它是符号链接或别名(我的猜测)。只是试图不从退后一步开始讨论。这些路径中唯一的共同部分是结尾:mydomain.com/public
  • @Ruben Trancoso:我没有看到有人在这个问题中提到任何关于符号链接的事情;如果您已经知道这一点,那么将其包含在问题中会很有用。此外,如果它是一个符号链接,那么 realpath() 将始终取消引用它,因此它的输入永远不会匹配输出。
  • azat 帖子之前刚刚提到过。
  • 那我一定是瞎了眼,这是整个帖子:“试试这个:$_SERVER['DOCUMENT_ROOT'] = realpath($_SERVER['DOCUMENT_ROOT']); echo $_SERVER[' DOCUMENT_ROOT'] . "\n"; 并阅读此(文档链接)" 呃,算了。我不会和你争论谁说了什么,谁没有。 Piskvor 退出。
【解决方案3】:

document_root 来自您的 Web 服务器配置文件,这就是它与 realpath 函数不同的原因。

【讨论】:

    【解决方案4】:

    嗯,DOCUMENT_ROOT 环境变量只是设置为错误的值。
    如果您无法控制此服务器,则无法自行修复。
    请求支持来修复或找到避免使用此变量的方法

    好像是ZF问题,我觉得很容易解决。
    我从未使用过该框架,但我确信它有单个入口点或一些配置文件。
    因此,您可以通过如下设置轻松伪造 DOCUMENT ROOT:

    $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../'); 
    

    其中 '/../' 表示从此类入口点到实际文档根目录的相对路径

    【讨论】:

    • DOCUMENT_ROOT 正是 PHP 所能达到的。真正的路径是它无法做到的。但是 zend 正试图进入真实路径。
    • 可能,实际路径被视为相对于根目录,错误显示根目录上的实际路径无法找到。
    【解决方案5】:

    echo realpath(dirname(FILE));

    这应该会有所帮助。在此链接上http://www.tech99.us/finding-absolute-path-in-php/you 可以找到使用这些功能的详细信息。上面一行中使用的每个函数都适用于 php4 和 php5。

    【讨论】:

      猜你喜欢
      • 2015-10-03
      • 2014-02-16
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2014-09-27
      • 2017-07-06
      • 2018-11-13
      • 1970-01-01
      相关资源
      最近更新 更多