PHP Url相对和绝对

时间:2014-04-14 08:52:08

标签: php

我有这堂课:

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

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

$page_builder->GetHeader();

header.phpHTML文件的顶部,其中包含一个菜单。我的问题是,根据调用PageBuilder的位置,更改菜单链接URL

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

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的文件夹中?

2 个答案:

答案 0 :(得分:1)

首先需要区分本地文件路径 URL 。这两个人彼此无关。 PHP及其__FILE__dirname()及相关部分仅处理服务器硬盘上的本地文件路径。另一方面,URL完全是任意字符串,需要以合理的方式组合在一起。如何通过URL引用任何一个特定文件的方式是无限的,由您自己来订购。

可以尝试使用$_SERVER中提供的各种路径来确定请求的URL,并根据该路径构建相对URL。但是,这很容易出错并且过于复杂。相反,您应该使用根相对URL。即而不是

foo/bar.html

相对于浏览器当前所使用的网址,您始终使用

/foo/bar.html

始终引用相同的网址,无论其当前相对于哪个网址。

如果您需要为所有网址添加前缀,我会创建一个包装函数,根据配置根据需要添加此函数,或者根据$_SERVER自动计算出自己的根URL。

答案 1 :(得分:0)

在@deceze的帮助下经过反复试验后,我只需将URL传递给路由类,该路由类在URL前加上'/ TestApp /',如果项目被移动,这可以轻松更改因为使用了类。

所以我这样做:

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

获取传递:

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

这不是最佳做法,但是没有一种语言不能遵循任何一种语言的最佳实践。

查看使用$_SERVER['PHP_SELF'];的@Anthony答案,它始终会提供TestApp文件夹。需要更多的研究,但我会接受。我假设它相对于服务器地址。