2011-03-07 59 views
2

我動態地添加ssi包括基於變量,我希望能夠有一個默認包括萬一文件不存在。即:SSI - 測試文件是否存在

if /file/testthisfile.ssi exists 
    add /file/testthisfile.ssi 
else 
    add /file/default.ssi 

這可能嗎?

謝謝!

回答

4

不 - 我害怕那個答案。但對於將來可能遇到此問題的任何人,我確實找到了適用於簡單情況的解決方法。您可以編輯的錯誤消息,在我的情況下,輸出的圖像:

<!--#config errmsg="<img src='/file/testthisfile.jpg' alt='' />" --> 

因此,如果該文件不存在,您可以設置默認。

必須強調,這隻適用於簡單的情況,但它是一個很好的小工作!

0

SSI不支持文件檢測。

0

我想了一會兒,確實ahgood是正確的,SSI沒有內置的文件檢測功能,所以流量控制是有限的。

順便說一句,我沒有找到SSI的擴展版本的引用(一個VMS爲基礎的系統)

http://wasd.vsm.com.au/doc/env/env_0400.html

,並有一些擴展,將允許你檢查在某些文件存在一種時尚。

但是,如果有人使用SSI,可能會在LAMP環境中運行,所以可以利用SSI在include語句中運行CGI/PHP腳本的能力。

沒有太多的麻煩,人們可以訴諸:

<body> 
<!--#include virtual="insert_intro.html" --> 
<h2>Insert An Existing File</h2> 
<!--#include 
virtual='checkFileExists.php?fn=insert_help.html&df=insert_default.html' --> 
<h2>Insert a Non-Existing File</h2> 
<!--#include 
virtual='checkFileExists.php?fn=insert_no_help.html&df=insert_default.html' --> 
</body> 

它使用PHP腳本來完成所有的文件檢查:

<?php 
$theFileName = $_GET['fn']; 
$theDefault = $_GET['df']; 
if (file_exists($theFileName) === TRUE) { 
    include($theFileName); 
} else { 
    include($theDefault); 
} 
?> 

我通過兩個文件名,預期的文件備份/默認文件,腳本檢查第一個,如果找不到,則使用第二個。

這種方法引發了一個問題,爲什麼在PHP可用時使用SSI?在某些情況下,特別是在遺留系統中,可能會有一個基於SSI的大型網站,儘管不夠優雅,但可以解決問題。

PHP不是強制性的,PERL腳本也可以工作。我試圖使用PHP的apache_setenv,但我無法弄清楚如何在PHP,Apache和SSI之間傳遞環境變量(我也嘗試設置$ _SERVER和$ _ENV變量但沒有成功)。

+1

這不是SSI解決方案,如果我們可以使用PHP代替,那麼問題將很容易解決。 =) – ahgood 2011-03-09 00:40:22

+0

確實的確如此...我仍然認爲混合解決方案值得一提。 – 2011-03-09 01:21:02

+0

這種方法也會引入嚴重的安全問題。 – insaner 2015-08-20 10:05:24

1

事實上,與這裏的答案相反,SSI確實支持文件存在測試。這是語法

<!--#if expr="-A /private" --> 
    Click <a href="/private">here</a> to access private information. 
<!--#endif --> 

支持-A標誌可能需要在您的apache配置中啓用。

在這個地方SSI所用的表述已被提取出來到這裏記錄

http://httpd.apache.org/docs/current/expr.html

Apache的一個表達式模塊,但-A標誌也是「遺產」 SSI表達解析器可用。

+0

下面是v2.2配置變量文檔的鏈接: http://httpd.apache.org/docs/2.2/mod/mod_include.html#ssienableaccess 如果我將它從「2.2」編輯爲「當前」,我發現但它似乎已經消失。它被...取代了嗎?不再支持? (這顯然不是沒有爭議;這不適用於我的服務器的默認配置。) – fortboise 2014-10-01 17:49:27

+1

「-A」不檢測是否存在,只檢查URL是否可訪問(不禁止)。還要注意,儘管v2.2文檔中提到「SSIEnableAccess」,但至少v2.2.24並不認爲這是一個有效的指令。 「SSIAccessEnable」似乎工作。 – 2015-02-04 17:07:44