正确的Apache语法如果用mod_macroexpression式

我试图利用Apache 2.4的<If>指令的能力来通过评估它的参数来定制一个<Macro>

我目前正在尝试执行以下操作:

  • 如果authenticationMode ==“htpasswd”使用.htpasswd文件
  • 如果authenticationMode ==“server”使用pwauth
  • 否则打破Apache的configuration

以下代码( <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式文档的一个很好的阅读也是有用的。