SSI - 测试文件是否存在

时间:2011-03-07 23:05:45

标签: html if-statement ssi

我正在基于变量动态添加ssi包含,并且我希望能够在文件不存在的情况下具有默认包含。即:

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

这可能吗?

谢谢!

6 个答案:

答案 0 :(得分:4)

不 - 我害怕那个答案。但是对于任何可能在未来遇到这个问题的人,我确实找到了解决简单案例的方法。您可以编辑错误消息,在我的情况下,输出图像:

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

因此,如果文件不存在,您可以设置默认值。

必须强调这只适用于简单的情况,但这是一个很好的小工作!

答案 1 :(得分:3)

实际上与此处的答案相反,SSI确实支持文件存在测试。这是语法

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

可能需要在apache配置中启用对-A标志的支持。

这个SSI中使用的表达式已经被分解到这里记录的apache表达式模块中

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

但-A标志在“旧”SSI表达式解析器中也可用。

答案 2 :(得分:0)

SSI不支持文件检测。

答案 3 :(得分: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变量,但没有成功)

答案 4 :(得分:0)

假设您正在运行Apache 2.4,则可以使用-F选项(请注意引号)。

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

从文档(http://httpd.apache.org/docs/current/expr.html):

  

如果字符串是有效文件,则为真,可通过所有服务器的   该路径的当前配置的访问控制。这使用   内部子请求进行检查,因此请谨慎使用-它可以   影响您服务器的性能!

为使该示例正常工作,Apache用户将需要访问您正在测试的目录/标记。您可能还需要.htaccess或httpd.conf文件中的以下内容:

<Directory /private>
Require all granted
</Directory>

答案 5 :(得分:0)

您可以这样做,

<!--#include virtual="/file/testthisfile.ssi" onerror="/file/default.ssi" -->

请注意,“-F”一元运算符以及“ -A”一元运算符仅指路径可访问性,而不是资源的实际存在。

在这里查看:http://httpd.apache.org/docs/2.4/expr.html(一元运算符)。

执行此类任务(-e,-s,-f)的操作员在mod_include下不可用。