PHP Url相对和绝对


PHP Url Relative and Absolute

我有这个类:

class PageBuilder {
    public function GetHeader() {
        include(dirname(dirname(__FILE__)) . '/template/header.php');
    }
}

调用时会将头文件插入到我的页面中。一切都很好。

$page_builder->GetHeader();

header.php中是HTML文件的顶部,该文件包括一个菜单。我的问题是,根据从哪里调用PageBuilder,会更改菜单链接URL s。

如何确保它们始终相对于根文件夹。

dirname(__FILE__)不起作用,因为它把URL变成了file:///,而且我真的不想附加整个http://www.blahblah.com/blah,因为如果它是相对于根的,那么这一切都无关紧要。

编辑

因此,当有人发帖时,你可以使用$_SERVER[''],但哪一个是可靠的,毫无疑问,PHP会提出一些令人眼花缭乱的警告。

看,我在想$_SERVER['SERVER_ADDR']$_SERVER['SERVER_NAME']$_SERVER['HTTP_HOST']。。。。。

目前正在进行$_SERVER['HTTP_HOST']。。结果是失败。

只是前缀为/就解析为localhost根,所以我的链接是localhost/admin/profile.php而不是localhost/TestApp/admin/profile.php,我真的必须指定它位于名为TestApp的文件夹中吗?

首先需要区分本地文件路径URL。这两者毫无关系。PHP及其__FILE__dirname()及相关部分只处理服务器硬盘上的本地文件路径。另一方面,URL完全是任意字符串,需要以合理的方式将其组合在一起。URL引用任何一个特定文件的方式都是无限的,这取决于你自己。

您可以尝试使用$_SERVER中可用的各种路径来确定请求的URL,并在此基础上构建相对URL。然而,这相当容易出错,而且过于复杂。相反,您应该使用根相对URL。即代替

foo/bar.html

相对于浏览器当前所在的URL,您总是使用

/foo/bar.html

它总是指同一个URL,而不管它当前相对于哪个URL。

如果你需要所有URL的前缀,我会创建一个包装器函数,根据配置或基于$_SERVER自动计算出自己的根URL,根据需要添加前缀。

在@deceze的帮助下反复尝试后,我只需通过一个路由类传递我的URL,该路由类在URL前面加上"/TestApp/",如果项目因为类的使用而被移动,这可以很容易地更改。

所以我做了:

<a href="<?php $url_routing->ParseUrl('admin/account/logout.php') ?>">Log Out </a>

获取通过:

public function ParseUrl($url) {
    return '/TestApp/' . $url;
}

这几乎不是最佳实践,但一种语言本身不遵循任何语言,就不可能有最佳实践。

看看@Anthony使用$_SERVER['PHP_SELF'];的答案,它总是给出TestApp文件夹。需要更多的调查,但我会接受的。我假设它是相对于服务器地址的。