包含html,同时保持相对于包含文件的路径

时间:2010-11-10 21:29:42

标签: php html include relative-path

将我想要的几个html片段包含在“父”文件中 父文件包含相对路径 这些片段还包含相对于其位置的相对路径 - 而不是相对于它们将包含在其中的文件 例如,一个代码段是标题,对于网站上的所有页面都是通用的。

<div style='background:url(img/bg.jpg)'>
  <img src='img/logo.png'>
</div>

这将插入现有页面,如下所示:

  <div style='background:url(img/gradient.jpg)'>
    <?php include '../includes/header.txt'; ?>
  </div>

示例非常简化,实际文件有很多路径 我无法控制将要包含的文件 这意味着我无法将PHP变量添加到网址。

我也无法以任何方式使路径绝对 对于包含的文件 - 因为我无法控制html 对于所有文件 - 因为最终页面在几台计算机上都是开发的,无论是在http://www.mysite/myfilehttp://localhost/mysite/myfile还是http://127.0.0.1/~/anyuser/都必须有效...

我有过一些想法:

  1. php includeinclude '../includes/header.txt';
    • 路径相对于已包含的文件而出现。
  2. 将每个代码段包含为iFrame:
    • 页面布局不是非常友好的iFrame。 SEO和&amp;页面加载问题。
  3. 解析页面并使用解析器替换所有路径。
    • 页面不是100%有效的HTML(无法控制它们),解析器咳嗽并滚动死亡。除了荒谬的服务器负载。
  4. 使用base tags
    • 在每个真实的浏览器中都能很好地工作 但Internet Explorer 7,8和9只是忽略了基本标记(在头部之外)。 可以在头部声明一个基本标记 ,但是页面上的所有其他路径(可能在CSS文件中)都将是错误的。
  5. BaseTag用法:

    <?php
      echo "<base href='$path_to_includes_folder' />";
      include '../includes/header.txt';
      echo "<base href='$path_based_on___file__' />";
    ?>
    

    据我所知,这就是创建基本标记的原因,并且在每个体面的浏览器中都得到支持 - 这样我们就可以在一个HTML文件的中间告诉浏览器我将要包含第二个HTML文件,并且所有路径都应该相对于新位置。这在IE6中运行得非常好,我认为必须有一些逻辑来放弃对它的支持。一些逃脱Opera,Webkit和Mozilla的逻辑。 我可以在这个主题上找到的唯一帖子赞扬微软放弃了支持,但没有给出接受标准 删除支持的原因(正在使用中)在当时的所有浏览器中)和有用的是一件好事。

    现在,我讨厌用激情开发IE,但不能忽视它。他们仍然拥有近1/3的用户!

    那么,如何将php片段与相对路径包含在一起,并将它们保存在相应的文件中呢?

    任何人都可以告诉我,如果MS有任何理由放弃基础支持,或者可以采取哪些措施来帮助恢复它?

1 个答案:

答案 0 :(得分:1)

对于这些情况,我使用以下内容,

$PROTOCOL = (!empty($_SERVER['HTTPS'])) ? 'https' : 'http';
$DOC_ROOT = $PROTOCOL.'://'.$_SERVER['SERVER_NAME'];

//The project path points to the root file (index.php, or whatever your index file is).
$projectRoot = dirname($DOC_ROOT.$_SERVER['SCRIPT_NAME']).'/';

然后你可以(使用你的例子)

<div style='background:url(<?php echo $projectRoot; ?>img/bg.jpg)'>
    <img src='img/logo.png'>
</div>

这将为您提供动态绝对路径。