我正在尝试动态检测页面的根目录,以便指向特定的脚本。
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
如何检测应用程序根目录的路径?
答案 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_SELF
或REQUEST_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用户提供解决方案。