O .htaccess é um arquivo especial para o Apache. Quando um usuário está navegando por alguma página do seu site, para todo diretório que ele tentar acessar, o Apache procura primeiro pelo tal do arquivo .htaccess e se encontrar, verifica se existe alguma restrição ou configuração especial.

Com o .htaccess podemos controlar diversos parâmetros, tais como:

  • acesso restrito (com ou sem uso de senha);
  • páginas de erro padrão;
  • página padrão de acesso ao site;
  • redirecionar diretivas;
  • URLs amigáveis;
  • grande auxílio no SEO do site;
  • entre muitas outras funções;

Nota: Ao colocar um arquivo .htaccess na pasta raiz de um site, ele atuará sobre todas as pastas deste. Mas, um arquivo .htaccess numa subpasta anula a ação do anterior passando a agir sobre essa pasta e suas subpastas.

O que é possível fazer com .htaccess:

Redirecionamento de URL

A linha abaixo faz com que o site seja redirecionado para o site do Globo.

RedirectMatch ^/$ http://globo.com

A linha abaixo faz com que o usuário ao acessar o site SEM o WWW seja redirecionado para WWW.dominio.com.br

RewriteEngine on
RewriteCond %{HTTP_HOST} ^dominio.com.br [NC]
RewriteRule ^(.*)$ http://www.dominio.com.br/$1 [L,R=301]

Redirecionamento de HTTP para HTTPS

Basta colocar o código abaixo em um arquivo .htaccess

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Redirecionamento 301

Basta colocar o código abaixo em um arquivo .htaccess

redirect 301 /antigo/arquivo_antigo.htm http://www.seusite.com.br/aquivo_novo.htm

Restringindo o acesso por IP/Hostname

As vezes precisamos restringir certos arquivos e diretórios para certos IPs. Isso é válido por exemplo, quando você tem um provedor, e só se quer permitir acessar algumas páginas de administração os IPs da Intranet do provedor. Para isso pode-se aplicar estas regras no .htaccess.

Exemplos de bloqueios:

1. Para bloquear o acesso ao IP 127.1.1.1:

    order allow,deny
    deny from 127.1.1.1
    allow from all

2. Para bloquear o acesso aos IPs 127.1.1.1 e 127.1.1.2 (vários IPs):

    order allow,deny
    deny from 127.1.1.1
    deny from 127.1.1.2
    allow from all

3. Para bloquear uma lista de IPs do tipo 127.12.x.x (range* de IP):

    order allow,deny
    deny from 127.12.0.0
    allow from all

Atenção: Se, por exemplo, você usar 127.12.1.x, você estará bloqueando os IPs: 127.12.1.0, 127.12.1.1 etc até o 127.12.1.255.

Mensagens de Erro personalizadas

Vamos supor que você tenha uma sub-página no seu servidor, e queira que as mensagens de erro do servidor sejam bonitinhas e no formato que você criou. Para fazer isso, você precisará apenas saber o que significa cada código de erro do servidor e apontar para a uma página com o .htaccess:

ErrorDocument 401 /erros/falhaautorizacao.html
ErrorDocument 404 /erros/naoencontrado.html
ErrorDocument 403 /erros/acessonegado.html
ErrorDocument 500 /erros/errointerno.html

Mudar a página padrão

DirectoryIndex é a diretriz que permite especificar qual arquivo deve ser carregado quando chegar uma solicitação de diretório ou URL que não especifique uma página em particular (tipo http://www.hostnet.com). Normalmente a página default é index.html e a chamada do exemplo é transformada em http://www.hostnet.com/index.html.

Se você quiser mudar as regras do jogo, não tem problema:

DirectoryIndex adoropizza.html

Se o seu .htaccess estiver no diretório raiz, esta diretriz faz com que a página default de todos os diretórios do seu site passe a ser adoropizza.html. Tem mais. Se você quiser usar outras páginas (ou até scripts) como default, basta adicionar as referências a gosto:

DirectoryIndex adoropizza.html index.php home.htm index.cgi index.pl

A linha acima, se o arquivo .htaccess estiver no diretório raiz, faz com que a procura da página default siga a lista especificada: adoropizza.html é a primeira a ser procurada; se for encontrada, ela é enviada para o usuário e a procura para por aí; se não for encontrada, index.php é a próxima… e assim por diante, até index.pl. Caso nenhum dos arquivos relacionados seja encontrado, aí entra o famoso erro 404.

Lembre-se que todos os diretórios abaixo do diretório raiz obedecem as regras ditadas pelo primeiro .htaccess acima deles, a não ser que o diretório possua seu próprio .htaccess. Se não existirem outros .htaccess em subdiretórios, para todos os diretórios do site vale o .htaccess do diretório raiz – as páginas default serão sempre as mesmas.

Diretiva para X-Forwarded-Proto do Apache no uso de SSL

Alguns aplicativos usam a variável X-Forwarded-Proto do Apache para verificar se o site possui SSL habilitado. Para o funcionamento correto dessa variável, é necessário que seja colocada no arquivo .htaccess a seguinte linha:

 SetEnvIf X-Forwarded-Proto https HTTPS=on

Habilitar cache via htaccess

Sempre que acessamos um site, o conteúdo disponível do mesmo tais como imagens, arquivos .css, arquivos .js, entre outros é baixado para o computador, permanecendo em uma área temporária até a página web ser encerrada.

A partir do primeiro acesso podemos instruir o navegador a guardar estes arquivos anteriormente baixados em um local chamado Cache e ainda definir o tempo em que esses arquivo ficarão armazenados.

Deste modo, ao acessar novamente o site, o navegador será instruído a buscar conteúdos diretamente do Cache. Caso ele não tenha nada armazenado no Cache ou o tempo de permanência tenha expirado, o processo voltará a ocorrer como se fosse um primeiro acesso, onde o navegador irá guardar novamente os arquivos em Cache.

Para realizar esse procedimento, insira as linhas de código abaixo dentro do arquivo .htaccess.

#Força a utilizar Cache-Control e Expires header
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
 FileETag None
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Html
ExpiresByType text/html "access plus 0 seconds"
# Data
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
# Feed
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/atom+xml "access plus 1 hour"
# Favicon
ExpiresByType image/x-icon "access plus 1 week"
# Media: images, video, audio
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# HTC files
ExpiresByType text/x-component "access plus 1 month"
# Webfonts
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
# CSS / JS
ExpiresByType text/css "access plus 1 year"
ExpiresByType application/javascript "access plus 1 year"
ExpiresByType application/x-javascript "access plus 1 year"
</IfModule>

Páginas Relacionadas