PHP模板include()导致目录错误

时间:2011-12-01 11:56:20

标签: php html css include image

当我使用php include()require()函数时,我遇到了这个问题。我会尽量在这里尽可能地解释它,但如果它没有意义,请告诉我。我正在构建一个主index.php具有include ('themes/main/header.php')的主题系统,但在链接样式表和图像时会出现错误。这是我的目录的设置方式。

  • 的htdocs
    • 的index.php
    • 主题
        • 的header.php
        • footer.php
        • 图像
        • CSS
        • JS​​

以下是我的header.php(条纹)的内容:

<html>
    <head>
        <link rel="stylesheet" href="css/layout.css" type="text/css" media="screen" />
    </head>
<body>
<div class="header">
<img src="images/logo.png" />
</div>

当我加载主index.php时,无法找到样式表和图像。我知道这是因为头文件被带入index.php文件但是有办法解决这个问题吗?非常感谢你。

7 个答案:

答案 0 :(得分:1)

PHP的include是(在PHP中)服务器端,但HTML文件中的引用是客户端的,因此它们引用了他们感知的文件(index.php)。只需调整文件中的路径即可容纳。

答案 1 :(得分:1)

最简单的解决方案是添加一个&#39; template_path&#39;变量到模板文件并将该变量传递给模板解析器:

<html>
    <head>
        <link rel="stylesheet" href="{TEMPLATE_PATH}css/layout.css" type="text/css" media="screen" />
    </head>
<body>
<div class="header">
<img src="{TEMPLATE_PATH}images/logo.png" />
</div>

答案 2 :(得分:0)

包含php中的文件并没有削减浏览器的路径,在html中它应该是

<link rel="stylesheet" href="/themes/main/css/layout.css" type="text/css" media="screen" />

答案 3 :(得分:0)

我在重新阅读您的问题后进行了编辑 - 将您的路径更改为:

href="/themes/main/css/layout.css" 
src="/themes/main/images/logo.png" 

这应该解决它,但你应该考虑使用'http'绝对路径作为最佳实践。我希望它有所帮助。

答案 4 :(得分:0)

我,对我自己来说,使用这样的东西:

define(SITE_ROOT, '/'); //client side root of website
define(SITE_PATH, '/var/www/mywebsite/htdocs/'); //serverside root of website 

function url($relative, $startingFrom = false, $echo = true) {
    $r = '';
    if($startingFrom === false) {
        $r = SITE_ROOT . $relative;
    } else {
        $forward = str_replace('\\', '/', $startingFrom);
        $path = substr($forward, 0, strrpos($forward, '/'));
        $r = SITE_ROOT . substr($path, strlen(SITE_PATH)) . '/' . $relative;
    }
    if($echo) {
        echo $r;
    } else {
        return $r;
    }
}

简而言之,这为您构建了“站点绝对”路径,这样您也可以更改“主题”的名称,而无需更改其包含的所有绝对引用。

这样,在header.php你可以写:

<link rel="stylesheet" href="<?php url('css/layout.css', __FILE__);?>" type="text/css" media="screen" />

该函数有几个可选属性,它们应该是自解释的。

答案 5 :(得分:-1)

通常有两种选择:

  • 首先,使用绝对网址(即包含http://.../css/layout.css的完整网址或仅包含来自根网址的路径,例如/themes/main/css/layout.css
  • 其次,从'main'文件构建一个相对路径,其中包含其他文件。在这种情况下,那将是/themes/main/css/layout.css

答案 6 :(得分:-1)

您需要将文件名引用到index.php。解决此问题的另一种方法是在包含完整网站URL的配置文件(或类似于index.php的小项目)中声明一些变量:

$site = http://www.example.com/

然后将此用于所有css,链接,脚本等引用。这样它将是一条绝对的道路。然后你可以做类似的事情:

<img src="<?= $site ?>images/logo.png" />

如果我没弄错,我认为使用绝对路径更适合SEO(搜索引擎优化)。