Como devo usar a diretiva <If> no arquivo .htaccess?

16

Estou tentando adicionar uma declaração condicional usando a diretiva If do Apache no meu arquivo .htaccess.

Eu referenciei esta página http://httpd.apache.org/docs/trunk/mod/core.html#if, mas ela não elabora muito / dá muitos exemplos. Dois exemplos incompletos são:

<Se% {REQUEST_METHOD} EM GET, HEAD, OPTIONS> 

e

<Se "$ req {Host} = ''"> 

Então, eu tentei adicionar isso ao meu arquivo .htaccess:

<Se% {SERVER_PORT} EM OBTER, CABEÇA, OPÇÕES>
   #nada aqui ainda
</If>

Mas continuo recebendo o Erro 500 ao tentar carregar a página. Isso está na minha instalação local e estava funcionando bem anteriormente (ou se eu remover esse código). Eu acredito que AllowOverride Allconfigurei globalmente, e o contexto da diretiva If deve deixá-la presente em .htaccess ("Contexto: configuração do servidor, host virtual, diretório, .htaccess").

Alguém pode me dar alguns exemplos de como usar corretamente a diretiva <If>, ou alguma orientação sobre por que ela não está funcionando para mim?

Obrigado!

cwd
fonte
1
Se você estiver recebendo um erro 500, isso significa que o Apache registrou algo no seu log de erros. O que diz isso? Além disso, seu teste para SERVER_PORTin GET,HEAD,OPTIONSnão faz nenhum sentido ( SERVER_PORTserá o número da porta numérica na qual a solicitação foi recebida).
Larsks
Obrigado, larsks. Parece que estou executando o apache 2.0, que não suporta a diretiva <If>. Talvez eu precise procurar a atualização para o 2.3. Pelo menos isso explica por que não há exemplos em nenhum lugar (porque o recurso é tão novo). Obrigado pelo conselho.
Cwd 22/02

Respostas:

15

<If> está disponível apenas no Apache 2.4+, portanto, verifique se você possui essa versão.

Exemplos

# Compare the host name to example.com and redirect to www.example.com if it matches
<If "%{HTTP_HOST} == 'example.com'">
  Redirect permanent "/" "http://www.example.com/"
</If>

<If "%{HTTP_HOST} =~ /regex/">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

<If "%{REQUEST_URI} =~ m#/regex/including/slashes/#">
  SecFilterEngine Off
  SecFilterScanPOST Off
</If>

Alternativas para <If>

Existem algumas outras soluções para fazer declarações condicionais no Apache 2.2, se você ainda está preso a isso.

  • Você pode definir variáveis ​​de ambiente através de:

    • Configuração do Apache
    • SetEnvIf
    • mod_rewrite RewriteMatch
  • Em seguida, você pode executar instruções condicionais usando

    <IfDefine MyEnvironmentVar>
       ...
    </IfDefine>
    

Exemplo:

# Set environment variable if we're on staging site
SetEnvIf Host staging ROBOTS_NOINDEX

# Set environment variable if we're within a specific folder
SetEnvIf Request_URI ^/app/webroot/files/ ROBOTS_NOINDEX

# Send custom header if environment variable is set
Header set X-Robots-Tag "noindex" ENV=ROBOTS_NOINDEX
Simon East
fonte
1
Teste, mas não funcione! no documento do apache, a <IfDefine>diretiva analisa apenas na inicialização e o parameter-nameis only pode passar pelo prompt de comando usando #httpd -Dx=y
William Leung
Suas "alternativas para se" estavam funcionando bem para mim, bom exemplo.
25717 Kyborek