Apache 2.4 多个链式 elseif 参数导致错误

Apache 2.4 多个链式 elseif 参数导致错误

尝试部署 Apache 配置时出现以下错误:

Syntax error on line 46 of /data/apache2/conf/mydomain.conf:
Multiple <ElseIf> arguments not supported.

这是我的配置

<If "%{REQUEST_METHOD} == 'POST'">
Header set Cache-Control "private, no-cache, no-store"
Header set Edge-Control "no-store"
</If>

<ElseIf  "%{REQUEST_URI} =~ m#^(/api/bin/getData\.json)#">
Header set Cache-Control "public, max-age=900"
Header set Edge-Control  "!no-store, public, max-age=900"
</ElseIf>

<ElseIf "%{REQUEST_URI} =~ m#^/api#" && "%{REQUEST_URI} !~ m#(.*)form.token(.*)#">
Header set Cache-Control "public, max-age=0"
Header set Edge-Control  "!no-store, public, max-age=300"
</ElseIf>

# never cache requests with parameters
<ElseIf  "%{QUERY_STRING} =~ m#^..*#">
Header set Cache-Control "private, no-cache"
Header set Edge-Control  "no-store"
</ElseIf> 

<Else>
# do somethign else
</Else>

第一次出现 ElseIf 时,它会发出叫声

但是 Apache 的文档说: http://httpd.apache.org/docs/2.4/mod/core.html#elseif

当且仅当给定条件的计算结果为真,并且同一范围内的最新或部分尚未应用时,才应用所附的指令。

这意味着在配置中应该可以有多个链式 ElseIf 语句,但它仍然会引发错误。

我错过了什么?

答案1

问题是每个If只能处理一个“表达式”,用双引号表示。

因此,

<ElseIf "%{REQUEST_URI} =~ m#^/api#" && "%{REQUEST_URI} !~ m#(.*)form.token(.*)#">

它需要

<ElseIf "%{REQUEST_URI} =~ m#^/api# && %{REQUEST_URI} !~ m#(.*)form.token(.*)#">

我完全同意这个错误非常具有误导性。

答案2

解决了,问题是错误的引号分割表达式

<ElseIf "%{REQUEST_URI} =~ m#^/api#" && "%{REQUEST_URI} !~ m#(.*)form.token(.*)#">

逻辑 AND 不再是表达式的一部分。Apache 返回的错误消息具有误导性。

相关内容