我正在尝试利用 Apache 2.4<If>
指令的强大功能,<Macro>
通过评估其参数来自定义 a。
我目前正在尝试执行以下操作:
- 如果 authenticationMode == "htpasswd" 使用
.htpasswd
文件 - 如果 authenticationMode == "server" 使用
pwauth
- 否则会破坏 Apache 配置
以下代码(<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 '('
怎么修?
您可以
<If>
在 a中使用<Macro>
,但不能使用<Macro>
with自定义 a<If>
。正如我在评论中提到的,
<Macro>
仅在启动时<If>
评估,并针对每个传入请求进行评估。要解决您的问题,请将您的
$authenticationMode
变量放在单引号中,因为它是一个字符串(正如您对右侧部分所做的那样):但是这个宏的作用如下:
在启动时,您的配置中有某处的说明
Use mymacro $param
mod_macro文档说:
(* = 文档中的示例是关于虚拟主机的)
因此,如果您有
Use mymacro htpasswd
,它将扩展到以下配置:这将为每个请求测试一些不太有用的条件。由于 DO_CRASH 指令,您的服务器将永远不会启动。
作为替代方法,我会考虑编写 2 个宏:一个对应于 authenticationMode == "htpasswd",另一个对应于 authenticationMode == "server"。
请测试并考虑到我仍在学习 Apache 2.4,所以它可能不是完整的答案......希望这会有所帮助!
仔细阅读Apache 的表达式文档也很有用。