使用 mod_macro 纠正 Apache If 表达式的语法

使用 mod_macro 纠正 Apache If 表达式的语法

我正在尝试利用 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 的表达式文档也可能有用。

相关内容