【问题标题】:SSI - test if a file existsSSI - 测试文件是否存在
【发布时间】:2011-03-07 23:05:44
【问题描述】:

我正在根据变量动态添加 ssi 包含,并且我希望能够拥有一个默认包含以防文件不存在。即:

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

这可能吗?

谢谢!

【问题讨论】:

    标签: html if-statement ssi


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      实际上与这里的答案相反,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 表达式解析器。

      【讨论】:

      • 这里是 v2.2 配置变量文档的链接:httpd.apache.org/docs/2.2/mod/mod_include.html#ssienableaccess 如果我将其从“2.2”编辑为“当前”,我发现它似乎已经消失了。是……被取代了吗?不再支持? (这显然没有实际意义;这不适用于我服务器的默认配置。)
      • "-A" 不测试是否存在,只测试如果确实存在 URL 是否可以访问(不被禁止)。另请注意,虽然 v2.2 文档说“SSIEnableAccess”,但至少 v2.2.24 不将其识别为有效指令。 “SSIAccessEnable”似乎有效。
      【解决方案3】:

      SSI 不支持文件检测。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 那不是SSI解决方案,如果我们可以使用php代替,那么问题将很容易解决。 =)
        • 确实非常真实......我仍然认为混合解决方案值得一提。
        • 这种方法也会带来严重的安全问题。
        【解决方案5】:

        假设您正在运行 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>
        

        【讨论】:

          【解决方案6】:

          你可以这样做:

          <!--#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 下不可用。

          【讨论】:

            猜你喜欢
            • 2011-02-16
            • 1970-01-01
            • 1970-01-01
            • 2011-05-27
            • 2010-12-28
            • 1970-01-01
            • 1970-01-01
            • 2017-07-29
            • 2018-12-25
            相关资源
            最近更新 更多