Por que minha diretiva SetEnvIfNoCase não corresponde ao URI solicitado?

2

Estou tentando configurar o Apache de forma que várias páginas de erro sejam exibidas com cabeçalhos / rodapés apropriados ao contexto do erro. Se o usuário solicitou uma página corporativa, quero mostrar o erro com a aparência corporativa. Se o erro ocorrer em nosso aplicativo, quero mostrá-lo com a aparência do aplicativo. Infelizmente, o Apache não quer jogar junto.

No meu teste, configurei o Apache para usar um documento específico ao exibir um erro 503 do HTTP:

# Service Unavailable
ErrorDocument 503 /errors/error_503.shtml

Nesse documento, usando diretivas SSI e variáveis de ambiente, construí uma lógica if / else, que poderia incluir condicionalmente esse ou aquele cabeçalho com base no conteúdo de uma variável de ambiente. Este é o meu arquivo de teste:

<!--#if expr="${is_corporate}" -->
corporate here.
<!--#else -->
I'M NOT CORPORATE.
<!--#endif -->
<!--#echo var="is_corporate" --> 
<!--#echo var="REQUEST_URI" --> 
This is a 503 error message! Check it out!

No entanto, não consigo corresponder ao URI da solicitação usando SetEnvIf na configuração do apache, sem nenhuma razão que eu possa entender.

   <Location />
      # Allow error documents to use the application or corporate header as appropriate
      SetEnvIfNoCase Request_URI /corporate/home/ is_corporate   # this does not match
      SetEnvIfNoCase Request_URI ^/$ is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/c is_corporate                # this does not match
      SetEnvIfNoCase Request_URI ^/C is_corporate                # this does not match
      SetEnvIfNoCase Request_URI .*/ is_corporate                # this matches
      SetEnvIfNoCase Request_URI .*  is_corporate                # this matches
    </Location>

Neste caso específico, meu documento de erro, imprimindo o conteúdo de REQUEST_URI exibe: /Corporate/Home/ e sempre indica que is_corporate está vazio. Usar SetEnvIfNoCase deve fazer com que seja uma correspondência insensível a maiúsculas e minúsculas, mas tentar maiúsculas / minúsculas não parece fazer diferença.

Como o SetEnvIf regex é supostamente compatível com pcre, testei o regex em perl, apenas para garantir que meu regex fosse legítimo e funcionasse da maneira que pretendo:

vezult@zapazoid:~$ echo '/Corporate/Home' |perl -e 'while(<>) { if (/^\/c/i) { print("match!!: $_\n");} else { print("no match: $_\n"); }}'
match!!: /Corporate/Home

Sim. De qualquer forma, estou perplexo. O que posso estar perdendo que está impedindo que minha instrução SetEnvIf se comporte como eu esperava?

    
por vezult 07.09.2011 / 23:14

1 resposta

1

O parâmetro Request_URI do SetEnvIf parece estar atualizado com o caminho do documento de erro quando ele está no processo de servir um.

Uma alternativa seria corresponder a outra coisa que teria o caminho pai presente, como o Referer header.

    
por 08.09.2011 / 16:24