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

Php 如何检测到应用程序根目录的路径?,php,Php,我试图动态检测页面的根目录,以便指向特定脚本 echo ($_SERVER['DOCUMENT_ROOT']); 它打印/myName/folder/index.php 我想在html文件中使用以下命令输入特定脚本: <a href="<?php $_SERVER['DOCUMENT_ROOT'].'lib/logout.php'?>">log out</a> <a href="<?php echo url_for('lib/logout.p

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

echo ($_SERVER['DOCUMENT_ROOT']); 
它打印/myName/folder/index.php

我想在html文件中使用以下命令输入特定脚本:

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

这似乎语法错误,路径未成功解析

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

同一个问题用不同的词:

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

在我的机器上应该是(包含index.php和所有子目录),在其他人的机器上可能是


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

您可能正在查找URL,而不是路径

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


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

可能您正在查找URL而不是路径

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


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

您的文档\u根目录是您的计算机本地的-因此它可能最终是c:/www或其他东西,对REQUIRE或INCLUDE之类的语句有用,但对链接不有用

如果你有一个网页可以在网上访问-链接回C:上的文档将尝试从本地机器获取该驱动器

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


您的本地页面-可能位于c:/www/myprojects/project1/lib/logout.php中,但站点本身可能位于

您的文档\u ROOT位于您的计算机本地-因此它可能最终位于c:/www或其他位置,对REQUIRE或INCLUDE等语句有用,但对链接不有用

如果你有一个网页可以在网上访问-链接回C:上的文档将尝试从本地机器获取该驱动器

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

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

框架,例如提供了一种复杂的路由机制,允许您编写如下链接URL:

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

它有大量的可能性,如中所述。

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

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


它有大量的可能性,如中所述。

在OP的一些澄清之后,就有可能回答这个问题

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

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 
\uuuu FILE\uuuu
常量将为您提供此文件的文件系统路径。如果你从中减去DOCUMENT_ROOT,剩下的就是你要找的。因此可以在模板中使用:

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

在OP进行了一些澄清之后,就可以回答这个问题了

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

$approot = substr(dirname(__FILE__),strlen($_SERVER['DOCUMENT_ROOT'])); 
\uuuu FILE\uuuu
常量将为您提供此文件的文件系统路径。如果你从中减去DOCUMENT_ROOT,剩下的就是你要找的。因此可以在模板中使用:

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

试试这个

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

这直接跳到根上。

试试这个

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


这直接跳到根目录。

DOCUMENT\u root
指的是Web服务器上的物理路径。没有检测http路径片段的通用方法。但是,您经常可以使用
PHP\u SELF
REQUEST\u URI

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

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


不过,最好是使用可配置常量来实现这些目的。此处发生的IF太多。

DOCUMENT\u ROOT
指的是Web服务器上的物理路径。没有检测http路径片段的通用方法。但是,您经常可以使用
PHP\u SELF
REQUEST\u URI

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

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


不过,最好是使用可配置常量来实现这些目的。这里发生了太多的如果。

我也在尝试为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代码跳过的)


我希望这有助于找到答案,或者为PHPER提供一个解决方案。

我也在尝试为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的文件,并将其保存在