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?