好的,我一直试图解决这个问题一段时间了。 我有一个我正在研究的网站,这里基本上是我的结构:
index.php
page-x/
index.php
page-x-y/
index.php
include/
functions.php
css/
main.css
除了添加更多子文件夹和索引页面。 基本上是三个不同级别的页面。
他们都需要拥有css / main.css,但任何一个索引页面的路径都会不同。
现在我使用functions.php添加CSS,并且必须手动输入从索引页面到functions.php的相对路径(即require_once("../include/functions.php");
或../../include
等
我怎样才能使functions.php能够找出包含它的任何索引页面到css / main.css的相对路径?
即。我如何为functions.php中的以下代码定义$relDir
:
echo '<link rel="stylesheet" type="text/css" href="' . $relDir . 'css/main.css" />';
我可以每次手动将""
或"../"
或"../../"
传递给该函数,但我可以避免这种情况吗?
编辑3
如果我在functions.php中定义$BASE = dirname(__DIR__);
,我可以找到网站的根,然后从那里获取CSS的绝对路径。
然而,css似乎没有正确链接,在我的本地机器上生成的链接看起来像:(我可以操纵斜杠以保持一致,但它没有帮助)
"C:\Documents and Settings\Lucas\site/css/main.css"
(注意:我在easyPHP上使用别名,以便我可以从http://127.0.0.1:8888/site/
连接到此地址,但__DIR__
找到该文件的ACTUAL目录。
在我正在测试的(我的大学)服务器上回来了
"/Volumes/Web/Students/MYNAME/Sites/MYSITE/css/main.css"
网站的ACTUAL网址如下:
http://www.SCHOOL.com/MYNAME/MYSITE/
CSS在两种情况下都不会链接
编辑2 我可以将$relDir
定义为:
str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');
根据索引的深度返回以下其中一项:
""
"../"
"../../"
这显然有很多处理。听起来最好的做法是调查适当的测试环境,并使用绝对路径。我会调查一下。我仍然有一些新东西。
编辑1:好的大多数人都建议我坚持手动操作,最初有一个类似的函数调用:
<?php require_once("../include/functions.php");
buildHead("Music", "../"); //($title, $relDir) ?>
我只需将每个页面的../
更改为两个地方的任何内容。
答案 0 :(得分:4)
为什么你甚至试图使用相对路径?你不能把它作为/css/main.css
链接吗?然后它将始终相对于您网站的根目录,而不是当前目录。
答案 1 :(得分:3)
最简单的方法?使用绝对路径。如果您的网站只停留在一条固定路径上,那就很容易了。如果您想让自己随意更改站点结构,请添加配置参数 - 例如。在每个PHP文件的顶部包含一个配置文件,并在其中定义一个$ BASE参数,该参数保存应用程序库的绝对路径,然后执行:
echo '<link rel="stylesheet" type="text/css" href="'.$BASE.'/css/main.css" />'
如果$ BASE为空,则默认为您的网络服务器的根目录。
您也可以使用__DIR__魔术常量自动执行所有这些处理(如果您使用的是PHP <5.3,则为__FILE__但是它没有太大变化 - 您只需要从您获得的文件名中删除文件名)。如果您在每个PHP文件的顶部包含此配置文件(或者您使用apache auto prepend指令),并且您的配置文件位于您网站的基本目录中,那么这就足够了:
$BASE = __DIR__;
否则,如果它位于目录中,您只需要上去,但这在部署时是已知的,并且不依赖于请求。
答案 2 :(得分:0)
嗯..我建议绝对链接css ......
否则你可以
echo str_repeat('../', substr_count($_SERVER['REQUEST_URI'], '/');
答案 3 :(得分:0)
您必须使用$_SERVER['DOCUMENT_ROOT']
获取您的站点基目录。然后将此值放入会话中。然后你可以使用
在base index.php中
$dir = $_SERVER['DOCUMENT_ROOT'];
$include = $dir. "/includes/functions.php";
$_SESSION['include_dir'] = $include;
您可以使用的其他文件
reqire($_SESSION['include_dir']);