我试图利用Apache 2.4的<If>指令的能力来通过评估它的参数来定制一个<Macro> 。
我目前正在尝试执行以下操作:
.htpasswd文件 pwauth 以下代码( <Macro>标记内)不起作用
SetEnv ROOT_PATH /somewhere #Set outside macro <If "$authenticationMode == 'htpasswd'"> # Guilty line! AuthUserFile $ROOT_PATH/path/to/.htpasswd </If> <ElseIf "$authenticationMode == 'server'"> AuthBasicProvider external AuthExternal pwauth </ElseIf> <Else> DO_CRASH </Else>
错误消息是Cannot parse condition clause: syntax error, unexpected T_OP_STR_EQ, expecting '('
怎么修?
您可以在<Macro>使用<If> ,但不能用<If>自定义<Macro> <If> 。
正如我的评论中所提到的, <Macro>仅在启动时评估,而<If>则针对每个传入请求进行评估。
为了解决你的问题,把你的$authenticationModevariables放在单引号中,因为它是一个string(就像你已经做了正确的部分一样):
<If "'$authenticationMode' == 'htpasswd'">
但是这个macros会做的是:
在启动时你在你的configuration中的某个地方Use mymacro $param
mod_macro文档说:
在服务器启动时,这些使用调用中的每一个都将被扩展为完整的虚拟主机(*),如macros定义所述。
(* =文档中的示例是关于虚拟主机的)
所以,如果你有Use mymacro htpasswd ,它会扩展到以下configuration:
<If "'htpasswd' == 'htpasswd'"> # Guilty line! AuthUserFile $ROOT_PATH/path/to/.htpasswd </If> <ElseIf "'htpasswd' == 'server'"> AuthBasicProvider external AuthExternal pwauth </ElseIf> <Else> DO_CRASH </Else>
这将testing每个请求一些不是非常有用的条件。 由于DO_CRASH指令,您的服务器永远不会启动。
作为替代方式,我会考虑编写2个macros:一个对应于authenticationMode ==“htpasswd”,另一个对应于authenticationMode ==“server”。
请testing,并考虑到我还在学习Apache 2.4,所以它可能不完整的答案…希望这会有所帮助!
对Apache的expression式文档的一个很好的阅读也是有用的。