如何检测应用程序根目录的路径?

时间:2011-03-29 13:24:52

标签: php

我正在尝试动态检测页面的根目录,以便指向特定的脚本。

echo ($_SERVER['DOCUMENT_ROOT']); 

打印/myName/folder/index.php

我想在html文件中使用这样的脚本输入:

<a href="<?php $_SERVER['DOCUMENT_ROOT'].'lib/logout.php'?>">log out</a>

这似乎是语法错误,路径未成功解决。

检测logout.php路径的正确方法是什么?

用不同的词语表达同样的问题:

如何从ANY子目录可靠地实现到根目录(包含我的index.php)的路径?无论html文件是在/ lib /子文件夹中还是在/ anotherDirectory中,我都希望它有一个指向/lib/logout.php的链接

在我的机器上它应该是http://localhost/myName/folder(其中包含index.php和所有子目录),在其他人身上它可能是http://localhost/project

如何检测应用程序根目录的路径?

7 个答案:

答案 0 :(得分:3)

经过OP的一些澄清后,可以回答这个问题。

如果所有php脚本中都包含一些配置文件,放在应用程序的根文件夹中,您可以使用此文件来确定应用程序根目录:

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 

__FILE__常量将为您提供此文件的文件系统路径。如果你从中减去DOCUMENT_ROOT,剩下的就是你要找的东西了。所以它可以在你的模板中使用:

<a href="<?php echo $approot?>/lib/logout.php">log out</a>

答案 1 :(得分:1)

可能您正在寻找的网址不是路径

<a href="http://<?php echo $_SERVER['HTTP_HOST']; ?>lib/logout.php">log out</a>

并且您没有在示例中回显该变量。

答案 2 :(得分:1)

您的DOCUMENT_ROOT是您机器的本地文件 - 因此最终可能是c:/ www或其他内容,对于REQUIRE或INCLUDE等语句非常有用,但对链接无用。

如果您在网络上可以访问某个页面 - 链接回C上的文档:将尝试从本地计算机获取该驱动器。

因此,对于链接,您应该能够使用初始斜杠将/lib/logout.php带到您的Web可访问结构的顶部。

您的本地页面可能位于c:/www/myprojects/project1/lib/logout.php中,但网站本身可能位于http://www.mydomain.com/lib/project.php

答案 3 :(得分:0)

Symfony这样的框架提供了一种复杂的路由机制,允许您编写如下链接网址:

<a href="<?php echo url_for('lib/logout.php') ?>">log out</a>

它有很多可能性,在the tutorial中有描述。

答案 4 :(得分:0)

试试这个,

<a href="/lib/logout.php'?>">log out</a>

直接跳转到root。

答案 5 :(得分:0)

DOCUMENT_ROOT指的是网络服务器上的物理路径。没有通用的方法来检测http路径片段。但是,您通常可以使用PHP_SELFREQUEST_URI

两者都取决于当前脚本的调用方式。如果当前请求是/ whatever /目录中的index.php,则尝试原始REQUEST_URI字符串。否则它很常见:

<?= dirname($_SERVER["SCRIPT_NAME"]) . "/lib/logout.php" ?>

但是,为此目的使用可配置常量通常是最好的。这里有太多的ifs。

答案 6 :(得分:0)

我也试图将这一点用于PHP。在asp.net中,我们有Request.ApplicationPath,这使得这很容易。

对于那些想要帮助的PHP流利的人来说,这段代码可以做OP所要求的,但是在asp.net中:

public string AppUrl
{
    get
    {
        string appUrl = Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath;
        if (appUrl.Substring(appUrl.Length - 1) != "/")
        {
            appUrl += "/";
        }
        // Workaround for sockets issue when using VS Built-int web server
        appUrl = appUrl.Replace("0.0.0.0", "localhost");
        return appUrl;
    }
}

我无法弄清楚如何在PHP中执行此操作,所以我所做的是创建一个名为globals.php的文件,我将其放在根目录中。它有这条线:

$appPath = "http://localhost/MyApplication/";

它是项目的一部分,但不包括在源代码管理中。所以各种开发人员只是将它设置为他们想要的任何东西,我们确保永远不会部署它。这可能是OP试图跳过的努力(因为我跳过我的asp.net代码)。

我希望这有助于找到答案,或者为PHP用户提供解决方案。