A diretiva Apache Directory deveria ser relativa ao DocumentRoot ou não?

14

A Directorydiretiva Apache deveria ser relativa ao DocumentRoot ou não? Eu pergunto no contexto de um VirtualHost, mas não deve fazer nenhuma diferença.

Em outras palavras, deveria ser:

<VirtualHost>
    DocumentRoot /var/www
    <Directory /var/www>
    ...

ou

<VirtualHost>
    DocumentRoot /var/www
    <Directory />
    ...

Ambos funcionam. Os documentos do Diretório Apache dizem:

O caminho do diretório é o caminho completo para um diretório ou uma sequência de caracteres curinga ...

... mas eles mostram dois exemplos que contradizem a declaração "caminho completo".

ED: Também existem exemplos contraditórios na página Ajuste de desempenho do Apache nas seções FollowSymLinks e SymLinksIfOwnerMatch e AllowOverride .

Por diversão, olhei a configuração vhost padrão do Debian e encontrei o seguinte:

<VirtualHost *:80>
    DocumentRoot /var/www
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    ...
Jeff
fonte

Respostas:

9

A documentação está correta e a <Directory>diretiva deve ser o caminho completo .

Seu primeiro exemplo é como você deve configurar a diretiva para VirtualHosts e aplicar as opções dentro da diretiva apenas a DocumentRoot. Seu segundo exemplo está se referindo à raiz do sistema de arquivos (literalmente /).

Você não publicou o restante da diretiva, mas isso geralmente é usado como uma maneira de tentar prender o Apache e restringir seu acesso, e geralmente é (mas nem sempre) colocado dentro dos arquivos principais apache2.confou de httpd.confconfiguração, com os VirtualHosts permitindo explicitamente acesso para seus próprios DocumentRootdiretórios; portanto, os dois são frequentemente usados ​​juntos.

Na documentação do Apache :

Observe que o acesso padrão para <Directory /> é permitir todo o acesso. Isso significa que o Apache httpd servirá qualquer arquivo mapeado a partir de uma URL. É recomendável que você altere isso com um bloco como:
    <Diretório />
      Exigir tudo negado
    </Directory>
e substitua-o pelos diretórios que você deseja que sejam acessíveis. Consulte a página Dicas de segurança para obter mais detalhes.
Craig Watson
fonte
Se o segundo exemplo se refere literalmente ao sistema de arquivos /, por que o Apache atende ao /var/wwwdiretório?
21413 Jeff
1
O Apache servirá o DocumentRoot. A Directorydiretiva é totalmente separada e tem o efeito de dizer "aplique a configuração incluída neste diretório e em todos os subdiretórios". Configurações mais específicas têm prioridade, portanto <Directory /var/www/>serão substituídas <Directory />.
Craig Watson
Entendo. Portanto, a <Directory />partir de um contexto do VirtualHost, pode substituir as opções (ou outras configurações) em todo o servidor <Directory />? Isso faz sentido. Obrigado pela ajuda.
21413 Jeff