Sintaxe correta para o Apache Se expressões com mod_macro

2

Estou tentando explorar o poder das diretivas <If> do Apache 2.4 para personalizar um <Macro> avaliando seus parâmetros.

Atualmente estou tentando fazer o seguinte:

  • Se authenticationMode == "htpasswd" usar .htpasswd file
  • Se authenticationMode == "server" usar pwauth
  • Outra quebra da configuração do Apache

O código a seguir (dentro de uma tag <Macro> ) 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?

    
por usr-local-ΕΨΗΕΛΩΝ 04.01.2015 / 22:31

1 resposta

3

Você pode usar <If> dentro de um <Macro> , mas não para personalizar um <Macro> com <If> .

Como mencionado no meu comentário, o <Macro> é avaliado apenas na inicialização e <If> são avaliados para cada solicitação recebida.

Para resolver seu problema, coloque sua variável $authenticationMode em aspas simples, porque é uma string (como você fez na parte direita):

<If "'$authenticationMode' == 'htpasswd'">

Mas o que essa macro fará é a seguinte:

No arranque, tem algures na sua configuração a instrução Use mymacro $param

O mod_macro doc diz:

At server startup time, each of these Use invocations would be expanded into a full virtualhost (*), as described by the Macro definition.

(* = O exemplo no documento é sobre virtualhosts)

Então, se você tiver Use mymacro htpasswd , ele será expandido para a seguinte configuração:

<If "'htpasswd' == 'htpasswd'"> # Guilty line!
    AuthUserFile $ROOT_PATH/path/to/.htpasswd
</If>
<ElseIf "'htpasswd' == 'server'">
    AuthBasicProvider external
    AuthExternal pwauth
</ElseIf>
<Else>
    DO_CRASH
</Else>

Isso testará para cada solicitação algumas condições não muito úteis. E o seu servidor nunca será iniciado por causa da instrução DO_CRASH.

Como alternativa, eu pensaria em escrever 2 macros: uma correspondendo ao authenticationMode == "htpasswd" e outra ao authenticationMode == "server".

Por favor, teste e leve em conta que eu 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.

    
por 08.01.2015 / 18:55

Tags