我有这堂课:
class PageBuilder {
public function GetHeader() {
include(dirname(dirname(__FILE__)) . '/template/header.php');
}
}
调用时会将头文件插入到我的页面中。一切都很好。
$page_builder->GetHeader();
header.php
是HTML
文件的顶部,其中包含一个菜单。我的问题是,根据调用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
的文件夹中?
答案 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
文件夹。需要更多的研究,但我会接受。我假设它相对于服务器地址。