2

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

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

这可能吗?

谢谢!

4

6 回答 6

4

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

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

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

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

于 2011-03-08T11:51:25.223 回答
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 表达式解析器。

于 2012-12-07T01:13:58.640 回答
0

SSI 不支持文件检测。

于 2011-03-08T01:21:31.427 回答
0

想了想,果然,啊古德是对的,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 变量但没有成功)。

于 2011-03-08T19:57:35.717 回答
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 下不可用。

于 2019-07-28T06:19:24.287 回答
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):

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

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

<Directory /private>
Require all granted
</Directory>
于 2019-01-03T21:38:01.003 回答