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

问题描述:

我试图动态检测我的页面的根目录,以便指向特定的脚本。如何检测应用程序根目录的路径?

echo ($_SERVER['DOCUMENT_ROOT']); 

它打印/myName/folder/index.php

我想在一个HTML文件,以用于输入一定的脚本是这样的:

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

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

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

在不同的词语同样的问题:

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

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

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

+0

文件在哪里? – fabrik 2011-03-29 13:28:12

+0

它在/ home/myName/alphp /文件夹中 – auge 2011-03-29 13:31:01

+0

您无法检测到logout.php的路径。到你的网站根目录? – 2011-03-29 13:37:38

也许你正在寻找的URL不是路径

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

,你是不是在呼应你的榜样变量。

+0

这导致http:// lib/logout.php – auge 2011-03-29 13:37:37

+0

@auge:将文件的扩展名从.html改为.php。 PHP未使用.html文件进行分析 – 2011-03-29 13:38:36

+0

@auge:此代码在其中执行的文件的扩展名是什么? – 2011-03-29 13:42:51

你的DOCUMENT_ROOT是你的机器本地的 - 所以它最终可能是c:/ www或者其他东西,对REQUIRE或INCLUDE等语句很有用,但对链接无用。

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

因此,对于链接,您应该能够通过初始斜杠前往/lib/logout.php,并直接访问网页可访问结构的顶部。

您的网页,在当地 - 可能是在C:/www/myprojects/project1/lib/logout.php但网站本身可能是在http://www.mydomain.com/lib/project.php

框架,如Symfony提供一个复杂的路由机制,它允许你写链接的网址是这样的:

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

它吨的可能性,这在the tutorial描述。

经过OP的一些澄清,它成为可能回答这个问题。

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

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

__FILE__不断会给你的文件系统中这条道路文件。如果你从它减去DOCUMENT_ROOT,剩下的就是你要找的东西。因此,它可以在你的模板中使用:

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

OP表示动态确定根。例如,在开发和生产中可能会有所不同。确切地说,是 – 2011-03-29 13:33:03

+0

。它不总是相同的路径,它取决于调用文件的位置 – auge 2011-03-29 13:36:29

+0

@auge不要称它为root然后。如果你想要相对路径,那么你必须要求这个。 – 2011-03-29 13:38:48

试试这个,

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

这跳转到直接根源。

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

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

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

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

我试图找出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用户提供解决方法。