2010-11-10 165 views
1

有几个我希望包含在“父”文件中的html代码片段。
父文件包含相对路径。
这些片段还包含相对路径,相对于它们的位置 - 与它们将包括在其中的文件无关。
例如,一个片段是标题,对网站上的所有页面都是通用的。包含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。
所有文件 - 因为最终的页面dev'd几台机器上,且必须在是否http://www.mysite/myfilehttp://localhost/mysite/myfile,甚至http://127.0.0.1/~/anyuser/ ...

一些想法我有:

  1. php includeinclude '../includes/header.txt';
    • 路径与其包含的文件相关。
  2. 包括每个片段作为一个iFrame:
    • 页面布局不是很友好的iFrame。除了SEO &页面加载问题。
  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开发,但不能忽视它。他们仍然有近三分之一的用户!

那么,如何包含相对路径的php片段,并保持它们相对于被包含的文件?

任何人都可以请告诉我,如果有任何理由在所有MS丢弃基地支持,或可以做些什么来帮助恢复?

+0

为什么要将基本标签放置在头部的任何位置?你想包括相关的PHP脚本(服务器端)或图像(客户端)?从你的问题来看,这不是很清楚。 – Phil 2010-11-10 21:45:37

+0

我没有发现你的问题非常清楚,但它似乎与include()或PHP没有任何关系。 include()语句的结果与包含文件的内容在源文件中的该位置粘贴的结果相同。所以,想象一下这个HTML就在那里,并且你没有使用include()。现在你的问题与include()无关,只是想知道你想如何处理应用程序中的路径。也许你应该为项目中更高级别的图像定义一个基本的URL,并在你的CSS中使用它。 – 2010-11-10 21:50:53

+0

@Phil - 我试图将HTML中包含的路径包含到图像,JavaScript或CSS文件中。我将基本标签放在包含的内容之前的原因是,包含的内容具有与该页面的其余部分不同的根,该部分与位置对象相关。如果我把基本标签放在头部,它会使页面上的所有路径相对于其他位置......为什么我要这样做? – SamGoody 2010-11-11 08:53:00

回答

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> 

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

+0

我无法将PHP放入路径中,因为我无法控制HTML。除了一百多次的时候切换每条路径的繁琐工作(在这个例子中,有两个网址)。 – SamGoody 2010-11-11 08:06:53