当引用图像时,我几乎总是执行以下操作
<img src="/images/logo.png" alt="logo">
这是一个相对文件路径,但它从网站的 根公共目录 开始。这样,它始终引用相同的位置,**无论代码片段最终位于哪个目录**。如果它没有以“/”开头,它仍然是一个相对文件路径,但位置将取决于您当时所在的目录。当您在 /index.php 时可能没问题,但如果它移动到 /contact/
,文件路径将断开,因为images 文件夹位于根目录,而不是 /contact/
中。
常识性内容。
但是,在处理像 PHP 这样的服务器端语言时,事情会变得更加复杂。您也可以使用 PHP 以这种方式进行包含
<?php include("header.php"); ?>
因为它没有以“/”开头,所以它遇到了与图像示例遇到的相同问题。如果包含代码移动到不同的目录,引用可能会断开。但是,对于 PHP,简单地使用开头的“/”**将不起作用**,这可能会非常令人困惑。
问题是 PHP 可以比 HTML 更深入地看到您的服务器文件系统。例如,CSS-Tricks 的公共 Web 目录实际上位于我的服务器上的“/var/www/vhosts/css-tricks.com/httpdocs”中。因此,当您在开头使用“/”进行包含时,它会比您想要深入的方式深入很多。您实际上希望它查看公共 Web 目录。在我的例子中,是“httpdocs”。
为了恢复此功能并拥有不会更改的相对文件路径,请使用以下 PHP 智能代码
<?php
$path = $_SERVER['DOCUMENT_ROOT'];
$path .= "/common/header.php";
include_once($path);
?>
对于所有程序员来说都是基本的东西,但这一个让我困惑了很长时间。
另一种技术
阅读 Brian Vanderberg 在
我发现,在某些环境中,
DOCUMENT_ROOT
似乎没有正确设置。我设计了一种方法,它独立于服务器,以及托管提供商是否提供了设置包含或自动前缀路径的能力。每个目录都包含一个名为
'__php__.php'
(或任何想要命名的名称)的'meta'
文件。对于该目录中的任何文件,只需将其包含为<?php include('__php__.php'); ?>
。该文件本身只是包含父目录中的文件,一直向上到站点根目录。站点根目录中的文件然后可以包含其他文件,这是一种简单的方法来自动包含文件,即使服务提供商不支持,也可以定义一个变量,例如'SITE_ROOTDIR'
,然后可以在以后使用。如果文档文件移动到另一个目录,它们仍然会包含该目录中的 __php__.php 文件,并且仍然从顶部的__php__.php
文件中获取SITE_ROOTDIR
常量。我还会对一个简单的导航栏执行类似的操作,其中每个目录都有一个
__navbar__.php
文件,每个页面只需在正确的位置包含它,它就可以包含父导航元素并定义自己的导航元素。这样做的一个优点是可以将站点的一部分分割成子目录,并且仍然获得该部分的根目录,即使它不是实际的文档根目录。缺点是,对于流量较大的网站,执行所有包含操作可能会降低速度。
还有另一个
<?php set_include_path( get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT'] ); ?>
这在非 Apache 服务器(如 IIS)上不起作用,因为 $_SERVER[‘DOCUMENT_ROOT’] 未设置。
我一直都在这样做,我很高兴看到我一直做对了!
非常感谢您!…
我一直都在抱怨这个问题,而且我认为是我无法正确配置 WAMP 来运行。
感谢上帝,您关心 PHP 新手!!!:P
但是(当然),我有一个新手问题
这段代码必须放在
<?php include (header.php) ?>
的位置,以便我们包含所有内容,对吗?我认为是这样,但只是想确认一下…
再次感谢…喜欢您的帖子和屏幕截图….
不必这样,只是这样操作会更智能一些
< ? php require_once $_SERVER[‘DOCUMENT_ROOT’] . ” /common/header.php ” ; ? >
更好的选择是像这样
$path = dirname(__FILE__) . DIRECTORY_SEPARATOR;
这样不会对任何文件位于文档根目录内做出任何假设。
天哪!
在我的 WAMP 安装中无法正常运行。还有其他需要注意的地方吗?
请记住,您的 DOCUMENT_ROOT 在大多数情况下应该可以正常工作,但它可能不是有效的文件系统路径。通常,在共享托管环境中,执行 dirname(__FILE__) 会返回当前 PHP 脚本的真实文件系统路径,但这两种路径可能不同。这在确定文件的绝对 URL 时尤为重要。
此外,请注意,Windows 文件路径使用反斜杠“\”,而 *nix 系统使用正斜杠“/”。
这样好多了
<?php
// index.php
$path = realpath(dirname(__FILE__)) . “/”;
include_once $path . “/common/header.php”;
?>
享受!;D
我的错误:应该是 MAMP 而不是 WAMP(我现在在 Mac 上),但无法编辑我的评论。
我读到了 Windows 中的反斜杠,但现在不是这种情况。
我搞不清楚问题出在哪里。
老实说,我从来没有尝试过/测试过在像您这样的本地机器上运行 PHP。如果它与常规服务器的行为略有不同,我不会感到惊讶。
您好 Chris 和各位,
非常有用的技巧。
我们建议使用一行 PHP 代码来实现更有效的解决方案
只需将这行代码包含在一个名为 config.php 的文件中一次,然后忘记包含文件的路径,只需使用
include_once("header.php");
此技术的优势在于它不会创建额外的变量,而是利用了 PHP 本身的 “include_path” 设置。此解决方案还可以避免 $_SERVER[‘DOCUMENT_ROOT’]; 变量与脚本的真实路径不同的情况。
谢谢 — 一直都在寻找这个。今天早上我把它传给了我的程序员。他很快就会成为忠实粉丝。
哇!真是太及时了。我正准备弄清楚如何处理 PHP 包含文件。您的帖子似乎总是与我目前正在处理的事情相关。
这样操作会更简单:yoursite.com/images/sample.png
看看这个 jQuery 图片轮播 cris,我尝试在 Twitter 上给你发私信
http://malsup.com/jquery/cycle/
更好的是,您可以将您的文档根目录添加到包含路径列表中,这样您就不需要创建路径
然后您只需执行
它将首先查看您的文档根目录。
但更好的做法是不要将您的 PHP 文件放在文档根目录中,而是放在其他地方,这样您就无法直接从 Web 访问 header.php。
很聪明…如果从 Web 加载,header.php 很可能完全没用,因此将其保留在公共目录之外会更明智。
非常好。请继续提供这些简单的提示和技巧。我非常感谢它们!
php 对我来说是一个很好的学习体验,但对于设计师来说绝对难以理解,至少对于这位设计师来说是这样的:) php include 真是太棒了,这里给出了很棒的技巧!
我一直都在使用这个
print("<?php include($_SERVER['DOCUMENT_ROOT']."/header.php"); ?>");
我认为它做着相同的事情,或者至少接近它,并且更加简洁。
呵呵…… 我已经使用 PHP 约 6 个月了,但我从未想过这一点。干得好!
是的,我之前也做过(以 jason 的身份),但我认为它不正确,我很高兴在这里看到它。
现在我明白我之前是对的。
PHP 实际上有一个配置变量,它包含它为查找要包含的文件而遍历的所有路径:include_path
因此,使用 ini_set(),您可以在运行时轻松覆盖或追加此变量。
我写了这个
等等,在 "images/logo.png" 的开头放置一个正斜杠应该指向根目录,而不用使用一堆 "../../etc"?我是否忽略了这些年的一些东西?
当我在远程主机上测试它时,它可以工作,但在我本地使用 OS X 中的默认 Apache 安装以及 MAMP 文件路径进行测试时,都没有工作。您如何在本地开发并使其正常工作?
正确。
在本地工作就是这样奇怪…… 我没有一个好的答案给你。我正是为了这个原因而避免这样做。如果当您上线后它都乱了,为什么要费心呢?
感谢您的回复,Chris。
如果是这样,您所说的“当我引用图像时,我几乎总是做类似这样的操作”是什么意思?
感谢您的网站。一直都是很棒的阅读体验。
我找到了一个方法,可以使用一个公开查看的文件(index.php),然后使用 Till Quack 方法 的一个稍微修改过的版本来解析 URL,然后在 HTML 的标题中设置一个元标记,使我的所有相对链接都能正常工作,如下所示
<base href="http://yoursite.com/" />
这消除了大部分与相对 URL 相关的麻烦,而且它也非常便携。在我实现它一次之后,我能够将代码移植到每一个新的项目中,没有任何问题。
您的方法看起来非常适合处理多个目录,但如果您的目录被修改,似乎可能难以维护。
很高兴在这里看到一些 PHP 代码!
-Jason
Chris 发布的代码在我的 MAMP 中运行良好。您可以在 MAMP 中检查您的 php 错误日志(在终端中输入
tail -f /Applications/MAMP/logs/php_error.log
)以查看它为何无法正常工作。如果只使用一次,也没有真正必要在代码中设置路径变量。这应该也能正常工作
我真想亲吻你,以表达对这段代码的感激之情。终于找到了一些能正常运行的东西,感谢 kyle! :)
所以如果
<img src="/images/logo.png" alt="logo" />
从根目录开始,那么这个代码会做什么呢?
<img src="./images/logo.png" alt="logo" />
<img src="./images/logo.png" alt="logo" />
部分基本上会引用相对于页面位置的 images 文件夹中的 logo.png 文件。
如果您将所有图像都放在 http://somedomain.com/images/ 中,但您的文件位于 http://somedomain.com/docs/ 中,它将使用的 logo.png URL 将是 http://somedomain.com/docs/images/logo.png。
不错的技巧,Chris!
这是我的两分钱;如果您发现自己经常进行相对于文档根目录的 PHP 包含操作,以下代码段可以节省一些按键操作
现在所有进行的包含操作都将相对于文档根目录。因此您可以直接使用
啊哈,之前不知道“set_include_path”,如果要进行多次包含,这显然是最有效的方法。
嘿 Chris,我非常喜欢你的作品。只是一个小问题——为什么不直接这样做呢?
对我来说这似乎更自然。
我认为评论引擎吞掉了您的代码示例。请随时将其发送到我的邮箱 [email protected],我会更新评论。感谢 Matt!
您还可以使用 require(‘filename.ext’),如果找不到文件,它将停止执行该行之后的任何内容。
define(‘APPLICATION_PATH’, realpath(‘../’));
$paths = array(APPLICATION_PATH, get_include_path());
set_include_path(implode(PATH_SEPARATOR, $paths));
function __autoload($className)
{
$filename = str_replace(‘\’, ‘/’, $className).’.php’;
require_once $filename;
}
只需将此文件包含到您的标题中,它就会自动获取所有文件并包含到标题中