我正在尝试利用 Apache 2.4 指令的强大功能,通过评估其参数<If>
来定制。<Macro>
我目前正在尝试执行以下操作:
- 如果 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 '('
怎么修?
答案1
您可以<If>
在 a 内部使用<Macro>
,但不能用 自定义<Macro>
a <If>
。
正如我在评论中提到的,<Macro>
仅在启动时进行评估,并且<If>
针对每个传入请求进行评估。
为了解决您的问题,请将您的$authenticationMode
变量放入单引号中,因为它是一个字符串(正如您对正确部分所做的那样):
<If "'$authenticationMode' == 'htpasswd'">
但是这个宏的作用如下:
在启动时,你的配置中某处有指令Use mymacro $param
这mod_macro医生说:
在服务器启动时,每个使用调用都会扩展为完整的虚拟主机 (*),如宏定义所述。
(* = 文档中的示例是关于虚拟主机的)
因此如果您有Use mymacro htpasswd
,它将扩展为以下配置:
<If "'htpasswd' == 'htpasswd'"> # Guilty line!
AuthUserFile $ROOT_PATH/path/to/.htpasswd
</If>
<ElseIf "'htpasswd' == 'server'">
AuthBasicProvider external
AuthExternal pwauth
</ElseIf>
<Else>
DO_CRASH
</Else>
这将针对每个请求测试一些不太有用的条件。并且您的服务器将因 DO_CRASH 指令而永远无法启动。
作为替代方法,我会考虑编写 2 个宏:一个对应于 authenticationMode ==“htpasswd”,另一个对应于 authenticationMode ==“server”。
请测试并考虑到我仍在学习 Apache 2.4,因此可能不是完整的答案...希望这会有所帮助!
值得一读Apache 的表达式文档也可能有用。