2011-03-07 60 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