从不同目录深度的不同页面动态添加相同的CSS文件

时间:2011-04-29 06:05:13

标签: php html web relative-path directory

好的,我一直试图解决这个问题一段时间了。 我有一个我正在研究的网站,这里基本上是我的结构:

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) ?>

我只需将每个页面的../更改为两个地方的任何内容。

4 个答案:

答案 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']);