2010-11-10 102 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