Apache 2.4.3 SSI如果expr没有变量?

时间:2013-01-28 18:40:06

标签: apache ssi

我有很多差异很小的文件。包含的文件包含此文件,它尝试区分较长路径的一部分:

<!--#if expr="${DOCUMENT_URI}=/internet/"-->Internet<!--#else-->Intranet<!--#endif-->

在错误日志中我得到了

  

AH01337:无法在/opt/apache/htdocs/ssi/time.shtml中解析expr“$ {DOCUMENT_URI} = / internet /”:'$'附近的解析错误

我发现这个主题有很多变化,比如没有大括号,引号内部的括号,注释结束前的空格或=〜,但没有任何帮助。似乎没有mod_include的调试设置,这会告诉我什么是错的......

我发现的另一个变种是

<!--#if expr='"${DOCUMENT_URI}"=~/internet/'-->

这没有错误。但它总是选择else分支,同样使用REQUEST_URI,就好像变量未设置一样。但我可以很好地回应他们。我还试过/.+internet.+/,以防它锚定它。

由于这些是CGI变量,我也尝试加载cgid_module - 也不好。

5 个答案:

答案 0 :(得分:9)

从版本2.3.13开始,mod_include已切换到#if流控制元素中条件表达式的新ap_expr语法。

添加SSILegacyExprParser on指令以切换到与Apache HTTPD 2.2.x及更早版本兼容的旧语法。

http://httpd.apache.org/docs/current/mod/mod_include.html#ssilegacyexprparser

答案 1 :(得分:2)

正如许多其他人所说,您可以使用v("foo")样式,但Apache 2.4文档(http://httpd.apache.org/docs/2.4/expr.html#examples)中给出的示例给出了以下形式:

<!--#if expr="%{DOCUMENT_URI} =~ /internet/"-->Internet<!--#else-->Intranet<!--#endif-->

注意变量上的%而不是$,以及正则表达式匹配的=~

我刚测试了这个,它运行正常。

(或者如前所述使用SSILegacyExprParser on,以允许与2.2.x格式向后兼容。但我希望在不久的将来某些时候将删除此兼容性。)

答案 2 :(得分:1)

我得到了它:

ListView

请参阅Flow Control Elements

答案 3 :(得分:0)

较新的Apache版本使用ap_expr。我只是想添加相关链接:Apache docs。请注意,v函数尚未记录。

答案 4 :(得分:0)

变量解析为文本字符串,因此需要用双引号括起来,你需要转义那些双引号....(警告这可能是不推荐使用的语法 - 我在旧的Apache 1上使用它只是在升级时从未更改过):

<!--# if expr="\"$DOCUMENT_URI\"=/internet/" -->