表达式在Apache2.4中是如何工作的?

表达式在Apache2.4中是如何工作的?,apache2,expression,ssi,Apache2,Expression,Ssi,在我将服务器从2.2版升级到2.4版后,服务器端Include中的一些表达式不再工作,这给了我一系列错误: AH01337:无法分析中的expr“$SERVER\u NAME=abc” /var/www/err/ft.html.var:分析“$”附近的错误 AH01337:无法分析中的expr“!$REDIRECT\u STATUS” /var/www/err/tp.html:分析“$”附近的错误 AH01337:无法分析expr“$HTTP_HOST=/^([a-z]{2}\.)abc\.co

在我将服务器从2.2版升级到2.4版后,服务器端Include中的一些表达式不再工作,这给了我一系列错误:

AH01337:无法分析中的expr“$SERVER\u NAME=abc” /var/www/err/ft.html.var:分析“$”附近的错误
AH01337:无法分析中的expr“!$REDIRECT\u STATUS” /var/www/err/tp.html:分析“$”附近的错误
AH01337:无法分析expr“$HTTP_HOST=/^([a-z]{2}\.)abc\.com”/ &&/var/www/err/tp.html中的“$SERVER_NAME=abc\.com”:解析错误 接近$'

我理解这是因为有些人只对所有配置指令使用一个称为ap_expr的变量。但是,在阅读文档之后,我仍然不知道如何转换一些旧代码以反映此更改:

<!--#if expr="! $REDIRECT_STATUS" -->
<!--#set var="REDIRECT_STATUS" value="404" -->
<!--#endif -->
<!--#if expr="$HTTP_HOST = /^([a-z]{2}\.)abc\.com/ && $SERVER_NAME = abc\.com" -->
<!--#set var="subdomain" value="$1" -->
<!--#else -->
<!--#set var="subdomain" value="" -->
<!--#endif -->

如果有人能指出如何改变上述内容,我将不胜感激。谢谢

警告

我确实尝试激活指令:

SSILegacyExprParser on

(如上述评论所述)

但这也杀死了我的SSistart标签配置

不再漂亮了{{echo var='var1'}


请注意,如果旧的注释语法出现在attributes>中,XHTML编辑器将阻塞:-(

我希望如果您对新语法感兴趣,您将得到如下结果:

<!--#if expr="-z %{REDIRECT_STATUS}" -->
<!--#set var="REDIRECT_STATUS" value="404" -->
<!--#endif -->
<!--#if expr="v('HTTP_HOST') =~ /^([a-z]{2}[.])abc[.]com/
           && v('SERVER_NAME') == 'abc.com'" -->
<!--#set var="subdomain" value="$1" -->
<!--#else -->
<!--#set var="subdomain" value="" -->
<!--#endif -->

我对1美元不太清楚,因为我昨晚刚刚转换的东西没有这样的用途(一些人认为它可能只在捕获它的同一个表达式中可用)。我发现正则表达式的工作方式与预期不符,例如,类似这样的表达式用于确定当前目录或子文档中的内容是否有效。最后一行与以“/”结尾的URI匹配,但我花了几个小时才发现%{REQUEST_URI}无法工作,只有v('REQUEST_URI')表单(不知何故,我希望找到与之相反的true)


看一看,似乎您必须打开它才能使用旧语法。@244an,是的,我看到了。只是想学习新语法,以防将来该选项被弃用。
<!--#if expr="((v('REQUEST_URI') =~ m_/index.shtml_)
            || (v('REQUEST_URI') =~ m_/index.html_)
            || (v('REQUEST_URI') =~ m_/index.cgi_)
            || (v('REQUEST_URI') =~ m_/$_))" -->