Configuração .htaccess do Apache2

Publicado: 23/10/2011 em CMS, Linux, Serviços IP
Tags:

Na prática, é comum ter dúvidas em como configurar o servidor de páginas Apache corretamente, o que é o meu caso também. Especialmente com relação aos aspectos de segurança e privilégios, que envolve os arquivos .htaccess (ou “arquivos de configuração distribuída”). É sobre isto que tratamos neste post.


1) Arquivos de configuração do Apache:

Diretivas nos arquivos de configuração podem ser aplicadas a todo o servidor, ou podem ser restringidas para aplicar somente à diretórios específicos, arquivos, hosts, ou URLs. Basicamente, estas diretivas podem ser aplicadas nos arquivos centrais de configuração do Apache e, de forma distribuída, nos arquivos .htaccess que estão espalhados nos diversos diretórios da árvore web do seu sítio. Os arquivos centrais de configuração do Apache estão em:


Debian: /etc/apache2/apache2.conf
CentOS: /etc/httpd/conf/httpd.conf

São diversas as diretivas que podem ser utilizadas nos arquivos centrais, tais como:

<Directory>
<VirtualHost>

Para fazer o Apache aceitar os arquivos .htaccess como arquivos especiais, ou desabilitar o uso deste arquivo de configuração, é conseguido pelo uso da diretiva AllowOverride no arquivo central de configuração do Apache.

2) O que são os arquivos .htaccess

O Apache permite o gerenciamento de configuração descentralizado através de arquivos especiais colocados dentro dos diretorios. Quando um usuário está navegando por alguma página do seu servidor Apache, para todo diretório que o Apache tentar acessar (e se o servidor estiver configurado para isso através da diretiva “AllowOverride“), o Apache procura pelo arquivo .htaccess e, se encontrar, verifica as restrições ou liberações para o usuário. Isto oferece um meio de fazer mudanças nas configurações por-diretório. Diretivas colocados em arquivos .htaccess se aplicam ao diretório onde se localiza este arquivo, e a todos os seus sub-diretórios. Os arquivos .htaccess seguem a mesma sintaxe que os arquivos de configuração principal. Como os arquivos .htaccess são lidos a cada requisição, as alterações feitas nestes arquivos têm efeito imediato.

No geral, arquivos .htaccess usam a mesma sintaxe que os arquivos de configuração principal. O que pode ser colocado nesses arquivos é determinado pele diretiva “AllowOverride“.

Um arquivo, contendo uma ou mais diretrizes de configurações, que está colocado em um diretório em particular, suas diretrizes se aplicam para aquele diretório e a todos os seu subdiretórios. Se existirem arquivos .htaccess nos diretórios superiores, as diretrizes são aplicadas na ordem que são achadas. Logo, um arquivo .htaccess em um diretório em particular, pode sobrescrever as diretrizes encontradas em um diretório acima deste em sua respectiva árvore. Estes, por sua vez, podem sobrescrever as diretrizes especificadas ainda mais acima, ou no próprio arquivo de configuração principal do servidor.

O manual do Apache traz a seguinte descrição sobre a diretiva “AllowOverride“:

Diretiva AllowOverride:
Objetivo: determina quais as diretivas que são permitidas em .htaccess
Sintaxe: AllowOverride All|None|directive-type [directive-type] ...
Default: AllowOverride All
Contexto: nas sessões "directory"
directive-type: AuthConfig Fileinfo Indexes Limit Options[=Option,...]

Onde:
AuthConfig: permite o uso de diretivas de autorização (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc.).
FileInfo: permite o uso das diretivas de controle de tipos de documentos.
Indexes: permite o uso de diretivas de controle de indexação de diretorios.
Limit: permite o uso de direticas de controle de acesso ao host (Allow, Deny and Order).
Options: configura quais recursos estão disponíveis em um diretório específico.

Exemplos de uso da diretiva “AllowOverride“:
(a) AllowOverride None ; não deve ser usado o arquivo .htaccess. Então os arquivos .htaccess são complementamente ignorados, onde o servidor Apache nem tentará ler os arquivos .htaccess presentes nos sistemas de arquivos.
(b) AllowOverride AuthConfig Indexes ; todas as diretrizes presentes em .htaccess que não sejam AuthConfig nem Índices causam um erro interno do servidor Apache.

3) Quando usar os arquivos .htaccess
O manual do Apache recomenda que, no geral, nunca se deve usar arquivos .htaccess. A não ser que não se tenha acesso ao arquivo de configuração central do servidor Apache. Existe, por exemplo, um erro de concepção que dita que a autenticação de usuários sempre deve ser feita usando os arquivos .htaccess. Esse simplesmente não é o caso. Pode usar as configurações de autenticação de usuário no arquivo de configuração central do servidor Apache, e isso é, de fato, a maneira mais adequada de se fazer as coisas.

Arquivos .htaccess devem ser usados em casos onde os provedores de conteúdo do site precisem fazer mudanças na configuração do servidor Apache por-diretório, mas não tem acesso root ao sistema do servidor. Caso o administrador do servidor não esteja disposto a fazer mudanças frequentes nas configurações do servidor, é desejável permitir que os próprios usuários possam fazer essas mudanças através de arquivos .htaccess. Isso é particularmente verdade, por exemplo, em casos onde provedores estão fornecendo múltiplos sites para usuários em apenas uma máquina, e querem que seus usuários possam alterar suas configurações.

No entanto, de modo geral, o uso de arquivos .htaccess deve ser evitado quando possível. Quaisquer configurações que se deseje considerar acrescentar em um arquivo .htaccess, podem ser efetivamente colocadas em uma seção <Directory> no arquivo central de configuração do servidor Apache.

Existem duas razões principais para evitar o uso de arquivos .htaccess:

a) A primeira delas é a performance. Quando a diretiva “AllowOverride” é configurada para permitir o uso de arquivos .htaccess, o Apache procura em todos diretórios por arquivos .htaccess. Logo, permitir arquivos .htaccess causa um impacto na performance, mesmo sem que a aplicação do usuário venha a usá-los de fato! Além disso, o arquivo .htaccess é carregado toda vez que um documento é requerido.

Além disso, note que o Apache precisa procurar pelos arquivos .htaccess em todos os diretórios superiores, para ter o complemento total de todas as diretivas que devem ser aplicadas. Então, se um arquivo de um diretório /www/htdocs/example é requerido, o Apache precisa procurar pelos seguintes arquivos:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess

Assim, para cada acesso de arquivo fora desse diretório, existem 4 acessos ao sistema de arquivos adicionais, mesmo que nenhum desses arquivos estejam presentes. (Note que esse só será o caso se os arquivos .htaccess estiverem habilitados para /, o que normalmente não é o verdade.)

b) A segunda consideração é relativa à segurança. Com o .htaccess habilitado está se permitindo que os usuários modifiquem as configurações do servidor, o que pode resultar em mudanças que podem fugir controle do administrador. Considere com cuidado se realmente é necessário dar aos usuários esses privilégios. Note também que dar aos usuários menos privilégios que eles precisam, acarreta em pedidos de suporte técnico adicionais. O administrador deve ter o cuidado de comunicar aos usuários que nível de privilégios eles têm e especificar exatamente o que é necessário através da diretiva “AllowOverride”.

c) Um exemplo comparativo:
Colocar um arquivo .htaccess em um diretório /www/htdocs/example contendo uma certa diretiva é exatamente equivalente a adicionar a mesma diretiva em uma seção Directory  <Directory /www/htdocs/example> na configuração central do seu servidor:

i) Conteúdo do arquivo .htaccess em /www/htdocs/example:
AddType text/example .exm

ii) Seção do arquivo httpd.conf:

<Directory /www/htdocs/example>
AddType text/example .exm
</Directory>

Os dois casos têm o mesmo efeito. Adicionando a diretriz ao arquivo de configuração central do servidor Apache resultará em uma menor perda de performance, na medida que a configuração é carregada no momento da inicialização do servidor, ao invés de toda vez que um arquivo é requerido.


4) Entendendo alguns aspectos do manual do Apache

O manual do Apache descreve os termos utilizados para descrever as diretivas. Abaixo, alguns dos aspectos imoprescindíveis o entendimento:

a) Contexto
Indica onde nos arquivos de configuração do servidor a directiva pode ser utilizada. É uma lista separada por vírgulas de um ou mais dos seguintes valores:
– server config : pode ser utilizada na configuração central servidor Apache (por exemplo, httpd.conf), poré não dentro dos containers <VirtualHost>  ou <Directory> . Também não é permitido nos arquivos .htaccess.
– virtual host: a directiva pode aparecer dentro de containers <VirtualHost> nos arquivos de configuração do servidor.
directory: directiva sendo válida dentro de <Directory>, <Location>, <arquivos>, e containers <Proxy> nos arquivos de configuração do servidor Apache.
– .htaccess: se uma directiva é válida neste contexto, significa que ela pode aparecer dentro por diretório nos arquivos .htaccess.

Por exemplo, para o caso da diretiva “AllowOverride” (explicada acima), o contexto de aplicação da mesma são nas sessões “directory“.

b) Override (reescritas de regras)
Este atributo de diretiva indica qual configuração de reescritas (substituições) devem estar ativas para que a directiva seja processada quando ela aparecer em um arquivo .htaccess. Se o contexto da diretiva não permitir que ela apareça em arquivos .htaccess, então nenhum contexto será listado.
Reescritas (substituições) são ativadas pela directiva “AllowOverride“, e se aplicam a um escopo específico (tal como a um diretório) e todos os diretórios descendentes, a não ser que posteriormente seja modificada através de outra directivas “AllowOverride” de níveis mais baixos. A documentação para essa diretriz também lista os nomes passíveis de substituções .

5) Como as diretrizes são aplicadas usando .htaccess
As diretrizes de configuração que se encontram em um arquivo .htaccess são aplicadas para o diretório no qual o arquivo .htaccess se encontra, e para todos os subdiretórios ali presentes. Mas, é importante lembrar também que podem existir arquivos .htaccess nos diretórios superiores. As diretrizes são aplicadas na ordem que são achadas. Logo, um arquivo .htaccess em um diretório em particular, pode sobrescrever as diretrizes encontradas em um diretório acima deste em sua respectiva árvore.

Exemplo:
No diretório /www/htdocs/example1 nós temos um arquivo .htaccess contendo o seguinte:
Options +ExecCGI

(Nota: deve-se ter “AllowOverride Options” para permitir o uso da diretriz “Options” nos arquivos .htaccess)

No diretório /www/htdocs/example1/example2 nós temos um arquivo .htaccess contendo:
Options Includes

Devido a esse segundo arquivo .htaccess, no diretório /www/htdocs/example1/example2, a execução de scripts CGI não é permitida, pois somente “Options Includes” está em efeito, o que sobrescreve completamente quaisquer outros ajustes previamente configurados.

6) Diretiva Options
O manual do Apache traz a seguinte descrição sobre a diretiva “Options“:

Diretiva Options:
Objetivo: configura quais recursos estão disponíveis em um diretório específico
Sintaxe: Options [+|-]option [[+|-]option] ...
Default: Options All
Contexto: server config, virtual host, directory, .htaccess
Override: Options

“Option” pode ser setado para “None”, no caso em que nenhum dos recursos extras são habilitados, ou setado para um ou mais das seguintes opções:

  • All : todas as opções exceto para "MultiViews". Esta é a situação default.
  • ExecCGI : execução de scripts CGI usando mod_cgi é permitido.
  • FollowSymLinks : o servidor Apache seguirá links simbolicos neste diretorio.
  • Includes : Server-side includes provido através de mod_include são permitidos.
  • IncludesNOEXEC : Server-side includes são permitidos, poré o "#exec cmd" e "#exec cgi" são desabilitados. É ainda possível fazer "#include virtual CGI scripts" através de "ScriptAliased directories".
  • Indexes : se uma URL o qual aponta para um diretorio é requisitada, e não existe um DirectoryIndex (por exemplo, index.html) naquele diretório, então "mod_autoindex" retornará uma listagem formatada dos aquivos presentes no diretorio.
  • MultiViews : Conteúdo negociado "MultiViews" são permitidos usando "mod_negotiation".
  • SymLinksIfOwnerMatch : o servidor apenas seguirá links simbólicos para o qual o arquivo alvo ou diretório é pertencente ao mesmo id do proprietário do link.

Se todas as opções na diretiva Options são precedidas por um símbolo + ou , as opções são mescladas com as dos outros arquivos .htaccess. Quaisquer opções precedidas por um + são adicionados às opções atualmente em vigor, e quaisquer opções precedidas por um são removidas das opções atualmente em vigor.
Por exemplo:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>


<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>

No exemplo acima, as opções FollowSymLinks e Includes estão valendo para o diretorio /web/docs/spec.

Links:
1- Tutorial Apache: htaccess
2- Documentação do Servidor HTTP Apache Versão 2.2

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s