【问题标题】:Include html while keeping paths relative to file being included包含 html,同时保持相对于被包含文件的路径
【发布时间】:2011-05-08 03:33:59
【问题描述】:

有几个我想包含在“父”文件中的 html sn-ps。
父文件包含相对路径。
这些 sn-ps 还包含相对路径,相对于它们的位置,而不是相对于它们将被包含到的文件。
例如,一个 sn-p 是标题,站点上的所有页面都通用。

<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 变量添加到 url。

我也无法以任何方式使路径成为绝对路径。
对于包含的文件 - 因为我无法控制 html。
对于所有文件 - 因为最终页面是在多台机器上开发的,并且必须在 http://www.mysite/myfilehttp://localhost/mysite/myfile 甚至 http://127.0.0.1/~/anyuser/ 上工作...

我的一些想法:

  1. php include: include '../includes/header.txt';
    • 相对于包含它的文件的路径。
  2. 将每个 sn-p 包含为 iFrame:
    • 页面布局对 iFrame 不太友好。除了搜索引擎优化和页面加载问题。
  3. 使用解析器解析页面并替换所有路径。
    • 页面不是 100% 有效的 HTML(无法控制它们)并且解析器咳嗽并翻滚死了。除了荒谬的服务器负载。
  4. 使用base tags
    • 在每个真正的浏览器中都能完美运行。
      但是 Internet Explorer 7、8 和 9 只是忽略了基本标记(在头部之外)。 一个基本标记可以在头部声明,但是页面上的所有其他路径(可能在 CSS 文件中)都将是错误的。

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 sn-ps,并保持它们相对于被包含的文件?

谁能告诉我是否有任何原因 MS 放弃了基础支持,或者可以做些什么来帮助恢复它?

【问题讨论】:

  • 为什么要将基本标签放在除了头部之外的任何地方?您想包含相关的 PHP 脚本(服务器端)还是图像(客户端)?你的问题不是很清楚。
  • 我觉得你的问题不是很清楚,但似乎与 include() 或 PHP 没有任何关系。 include() 语句的结果与将包含文件的内容粘贴在源文件中的该点相同。所以想象一下这个 HTML 一开始就在那里,而你没有使用 include()。现在您的问题与 include() 无关,只是要弄清楚您希望如何处理应用程序中的路径。也许你应该为项目中更高级别的图像定义一个基本 URL,并在你的 CSS 中使用它。
  • @Phil - 我正在尝试包含其中包含图像、javascript 或 CSS 文件路径的 html。我将基本标记放置在包含的内容之前的原因是,包含的内容与页面的其余部分具有不同的根,这是相对于位置对象的。如果我将基本标签放在头部,它会使页面上的所有路径都相对于其他位置......我为什么要这样?
  • @Dan Grossman - 问题不在于 PHP 的 include();这是如何使用 PHP 包含一个 sn-p,同时以某种方式保持该 sn-p 中的路径有效。也许是为了理解为什么应该放弃以前接受的机制。没有办法只为图像重新定义基本 URL,但即使有,它也会删除与页面相关的所有图像。作为第三个问题,为什么这不正常 - 我有很多用处将一次编写为 HTML 并在需要的地方包含它。
  • @SamGoody - 基本标签是并且始终只允许在头部部分。它使用影响hrefsrc 属性中的所有相对路径。如果这不足以满足您的需求(图像和 JS 的不同基础),您将需要手动更新您的 relative 路径。

标签: php html include relative-path


【解决方案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>

这会给你一个动态的绝对路径。

【讨论】:

  • 我无法将 PHP 放入路径中,因为我无法控制 HTML。除了在超过一百条路径时切换每条路径的繁琐工作(在提供的示例中,有两个 url)。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 2012-04-08
  • 2012-12-26
  • 2011-12-08
  • 2013-04-09
  • 1970-01-01
  • 2014-04-24
  • 2014-11-15
相关资源
最近更新 更多