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


PHP Template include() causing directory errors

当我使用php include()require()函数时,我一直有这个问题。我会尽量在这里解释清楚,但如果不明白,请告诉我。我正在建立一个主题系统,其中主要index.phpinclude ('themes/main/header.php'),但链接样式表和图像时存在错误。以下是我的目录。

    • 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文件中,但有别的办法吗?非常感谢。

PHP的include(在PHP中)位于服务器端,但HTML文件中的引用是客户端,因此它们引用的是它们感知到的文件(index.php)。

最简单的解决方案是在模板文件中添加一个'template_path'变量,并将该变量传递给模板解析器:

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

对于我自己,我使用这样的代码:

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" />

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

包含的文件在PHP中不会切断浏览器的路径,在HTML中应该是

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

我在重读你的问题后做了一个编辑,把你的路径改成这样:

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

应该解决这个问题,但你应该考虑使用'http'绝对路径作为最佳实践。

您需要将您的文件名放在index.php的引用中。另一种解决这个问题的方法是在配置文件中声明一些变量(或在像这样的小项目中,只是在index.php中),其中包含您的完整网站URL:

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

然后将其用于所有的css,链接,脚本等引用。这样它就是一条绝对路径。然后你可以这样做:

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

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

通常有两个选项:

  • 首先,使用绝对url(即包含http://.../css/layout.css的完整url或仅从根目录的路径,例如/themes/main/css/layout.css)
  • 第二,从包含其他文件的"main"文件构建一个相对路径。在本例中,它将是/themes/main/css/layout.css