尝试部署 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 返回的错误消息具有误导性。