当我使用php include()
或require()
函数时,我一直有这个问题。我会尽量在这里解释清楚,但如果不明白,请告诉我。我正在建立一个主题系统,其中主要index.php
有include ('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
。