6

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

<!--#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 - 也不好。

4

5 回答 5

11

从版本 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

于 2013-07-04T23:25:16.120 回答
3

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

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

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

我刚刚对此进行了测试,并且效果很好。

(或者SSILegacyExprParser on也提到了使用,以允许与 2.2.x 格式的向后兼容性。但我希望这种兼容性将在遥远的将来的某个时候被删除..)

于 2016-08-17T10:34:51.303 回答
1

我得到了它的工作:

 <!--#if expr='v("foo") = "bar"' -->
 foo is bar
 <!--#endif --> 

请参阅流控制元素

于 2015-11-08T10:31:14.987 回答
0

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

<!--# if expr="\"$DOCUMENT_URI\"=/internet/" -->
于 2013-05-26T13:14:59.350 回答
0

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

于 2013-02-05T13:04:31.723 回答