我有很多差异很小的文件。包含的文件包含此文件,它尝试区分较长路径的一部分:
<!--#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 - 也不好。
答案 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)
答案 3 :(得分:0)
较新的Apache版本使用ap_expr。我只是想添加相关链接:Apache docs。请注意,v函数尚未记录。
答案 4 :(得分:0)
变量解析为文本字符串,因此需要用双引号括起来,你需要转义那些双引号....(警告这可能是不推荐使用的语法 - 我在旧的Apache 1上使用它只是在升级时从未更改过):
<!--# if expr="\"$DOCUMENT_URI\"=/internet/" -->