apache2: por que o parâmetro LimitExcept resulta do erro “negar não permitido aqui” na tag virtualhost?

6

Pedi a mesma pergunta para stackoverflow mas depois pensei que poderia estar mais relacionado com isso aqui.

no httpd.conf do apache entre VirtualHost tags eu coloquei a expressão <LimitExcept> da seguinte forma:

<VirtualHost *:80>
 ServerName geopreprod.xxx.com.tr

 <LimitExcept HEAD POST GET>
     Deny from all
 </LimitExcept> 

  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass / http://XXXXXXXX...
  ProxyPassReverse / http://XXXXXXXX....
</VirtualHost>

e, em seguida, o servidor web apache falha ao iniciar, dando o seguinte erro:

Syntax error on line 513 of XXXXX/httpd.conf:
deny not allowed here

Embora seja possível usar <LimitExcept> na tag VirtualHost em documentos oficiais por que recebo esse erro?

em documentos do apache diz:

Context:    server config, virtual host, directory, .htaccess
    
por destan 03.02.2012 / 11:52

2 respostas

13

Contanto que seu bloco <LimitExcept> esteja dentro de um contexto válido para as diretivas Allow / Deny , ele funcionará bem.

Se você tentar colocar até mesmo uma regra Deny nua diretamente no contexto <VirtualHost> , verá que ela é negada da mesma forma - <VirtualHost> com Deny não é permitido, então nenhum dos dois adicionando um <LimitExcept> entre eles.

Mas o truque é que <LimitExcept> e alguns outros tipos de bloco como <IfModule> não modificam o contexto de uma diretiva; você nunca verá "limite" na lista de contextos aceitáveis na documentação de uma diretiva.

Existem apenas quatro contextos que podem determinar se uma diretiva é permitida :

  • configuração do servidor
  • host virtual
  • Diretório
  • (que inclui também as diretivas de tipo <Location> e <Files> )
  • .htaccess

No caso das diretivas mod_authz_host ( Order , Allow e Deny ), elas só são permitidas em contextos de diretório e htaccess, então elas sempre errarão quando não estiverem em um.

No seu caso, não há localização do sistema de arquivos para este vhost de proxy reverso, então você vai querer usar um <Location> block (que é um contexto válido para Allow / Deny porque é do contexto do diretório tipo):

<Location />
    Order allow,deny
    Allow from all
    <LimitExcept HEAD POST GET>
        Deny from all
    </LimitExcept>
</Location>

Ah, e livre-se desse <Proxy *> block, já que ele não está fazendo nada - o <Location> tem precedência sobre isso de qualquer forma, mas está em conflito com as restrições do <LimitExcept> ... então isso me deixa nervoso .

    
por 03.02.2012 / 21:40
2

A mensagem de erro diz que Deny não é permitido em um bloco <LimitExcept> .

De uma parte diferente dos documentos: "As diretivas fornecidas por mod_authz_host são usado nas seções <Directory> , <Files> e <Location> , bem como arquivos .htaccess ".

    
por 03.02.2012 / 12:29