Estou tentando explorar o poder das <If>
diretivas do Apache 2.4 para personalizar um <Macro>
avaliando seus parâmetros.
Atualmente estou tentando fazer o seguinte:
- Se authenticationMode == "htpasswd" use
.htpasswd
o arquivo - Se authenticationMode == "servidor" use
pwauth
- Caso contrário, quebre a configuração do Apache
O código a seguir (dentro de uma <Macro>
tag) não funciona
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>
A mensagem de erro éCannot parse condition clause: syntax error, unexpected T_OP_STR_EQ, expecting '('
Como consertar?
Você pode usar
<If>
dentro de um<Macro>
, mas não personalizar um<Macro>
com<If>
.Conforme mencionado em meu comentário, o
<Macro>
é avaliado apenas na inicialização e<If>
é avaliado para cada solicitação recebida.Para resolver seu problema, coloque sua
$authenticationMode
variável entre aspas simples, porque é uma string (como você fez para a parte certa):Mas o que essa macro fará é o seguinte:
Na inicialização, você tem em algum lugar em sua configuração a instrução
Use mymacro $param
O documento mod_macro diz:
(* = O exemplo no documento é sobre virtualhosts)
Portanto, se você tiver
Use mymacro htpasswd
, ele será expandido para a seguinte configuração:Isso testará para cada solicitação algumas condições não muito úteis. E seu servidor nunca iniciará por causa da instrução DO_CRASH.
Como alternativa, eu pensaria em escrever 2 macros: uma correspondente ao authenticationMode == "htpasswd" e outra para o authenticationMode == "servidor".
Por favor, teste e leve em consideração que ainda estou aprendendo o Apache 2.4, então pode não ser uma resposta completa... Espero que isso ajude!
Uma boa leitura do documento de expressão do Apache também pode ser útil.