Utilidades do arquivo .htaccess

Quem possui um site hospedado em plataforma linux certamente já trabalhou ou pelo menos ouviu falar do Apache. O .htaccess é um arquivo de controle do apache, cujas as funções são: redicionar URLs, bloquear diretórios com senhas, criar erros personalizados como o erro 404, escolher se o site acessa sem o com o www  e etc. Neste artigo serão detalhados as principais configurações deste arquivo.

O .htaccess é um arquivo sem nome, ou seja, ele possui apenas extensão. Para criar as regras abaixo, abra o bloco de notas ou similar, salve como “todos os arquivos” e com o nome .htaccess. Vale ressaltar que alguns códigos só funcionarão se determinadas extensões estiverem habilitadas no apache. Caso algum código gere um erro 500, habilite no apache o módulo correspondente a ele. E para evitar tais erros, faça os códigos em estruturas condicionais (<IfModule>), assim o código só será executado caso o módulo esteja ativo.

Ocultando o index da URL

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^/]+/)*index\.html\ HTTP/
RewriteRule ^(([^/]+/)*)index\.html$ http://www.seusite.com.br/$1 [R=301,L]
#obs, se o seu site é feito em php, substitua os "html" pelo mesmo

Protegendo o seu site contra cópia ou uso indevido de arquivos (como scripts php, js, css, imagens)

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://seusite.com.br/.*$ [NC]  #este site está liberado a usar (o seu site no caso)
RewriteCond %{HTTP_REFERER} !^http://www.seusite.com.br/.*$ [NC]  #este site está liberado a usar
RewriteCond %{HTTP_REFERER} !^http://www.google.com.br/.*$ [NC]  #liberar o google para usar as suas imagens
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|php|js|swf)$ – [F,NC]
#Neste caso, se alguém que não está na lista acima tentar usar as suas imagens direto do seu site ou usar os seus scripts, mostrará uma tela com erro e as imagens não serão mostradas.

Bloquear o arquivo .htaccess contra acesso pela URL

<Files ~ "^\.(htaccess|htpasswd)$">
  deny from all
</Files>

Bloqueando arquivos específicos contra acesso pela URL

<files seuarquivo.php>
  order allow,deny
  deny from all
</files>

Sempre colocar “www” na URL

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(seusite\.com\.br)(:80)? [NC]
RewriteRule ^(.*) http://www.seusite.com.br/$1 [R=301,L]
order deny,allow

Comprimir arquivos do site para consumir menos banda

<IfModule mod_deflate.c>
  <FilesMatch "\.(js|css|jpg|png|gif|ico|php|html|htm)$">
    <ifModule mod_filter.c>
      SetOutputFilter DEFLATE
      AddOutputFilterByType DEFLATE text/css text/javascript application/x-javascript text/html text/plain text/xml image/x-icon
    </IfModule>
  </FilesMatch>
</IfModule>

Criando páginas de erros personalizadas

ErrorDocument 400 /sua-pagina-erro-400
ErrorDocument 404 /página-de-erro-404
ErrorDocument 500 /página-para-erro-500
#obs saiba mais sobre como criar páginas de erros personalizadas

Alterar a página inicial (padrão) do site

DirectoryIndex minhaoutrapagina.html

Redirecionamento 301 com htaccess

Redirect 301 /página-a-ser-movida  http://www.seusite.com.br/pagina-movida-para-ca

Bloquear listagem de diretórios

Options -Indexes

Forçar o uso de SSL

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://seu-site.com.br/$1 [R,L]

Desabilitar case sensitive

CheckSpelling On
#agora a url PAGINA.HTML é igualmente acessada por pagina.html

Restringindo o acesso por IP

Order allow,deny
allow from 192.168.0.
deny from all
 # Deixa a somente a INTRANET acessar
Order deny,allow
deny from 192.168.0.25
allow from all
# Deixa todo mundo acessar, menos o IP 192.168.0.25
Order deny, allow
deny from all
#bloquear geral

Redirecionar acesso de um site para outro lugar

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?bloqueado.com.br.*$ [NC]
RewriteRule .* http://www.antispam.br [R,L]
#Se o site "bloqueado" mandar algum visitante para aqui, é redirecionado para o "antispam"

Expressões regulares

#todos os arquivos de uma página serão redirecionados para outra
RewriteEngine on
RewriteRule ^pagina-antiga/(.*) http://www.novosite.com.br/pagina-antiga/$1
#redirecionar somente os arquivos terminados em php
RewriteEngine om
RewriteRule ^pagina-antiga/(.*)\.php http://www.novosite.com.br/pagina-antiga/$1.php
#redirecionar tudo de um site para outro
RedirectMatch permanent /(.*) http://www.novosite.com/$1

Retirar extensões da URL

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
#neste caso, estou retirando apenas o HTML

Forçar o uso do Charset UTF-8 para arquivos

<FilesMatch "\.(htm|html|css|js)$">
  AddDefaultCharset UTF-8
</FilesMatch>

Cache de navegador – Definir tempo de expiração (segundos)

<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault A0
  ExpiresByType image/gif A604800  
  ExpiresByType image/jpeg A604800
  ExpiresByType image/png A604800
  ExpiresByType text/css A604800
  ExpiresByType text/javascript A604800
  ExpiresByType application/x-javascript A604800
</ifModule>

Cache de navegador – Definir controle de cache (segundos)

<IfModule mod_headers.c>
 <FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf|xml|woff)$">
 Header set Cache-Control "max-age=604800, public"
 Header append Vary User-Agent env=!dont-vary
 Header append Vary Accept-Encoding
 Header unset Pragma
 </FilesMatch>
</IfModule> 

Cache de navegador – Forçar o uso do cache, desabilitando o ETag

<IfModule mod_headers.c>
 Header unset Etag
 Header unset Last-Modified 
</IfModule>
#obs saiba mais sobre cache com htaccess

Adicionar novos mimetypes

AddType application/x-endnote-connection enz AddType application/x-endnote-filter enf AddType application/x-spss-savefile sav 

Desabilitar execução de certos Scripts

Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

Alterar a linguagem Padrão

DefaultLanguage en-US

Alterar fuso horário padrão

SetEnv TZ America/Indianapolis

Forçar download de certos arquivos

AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

Bloquear requisição baseado no user-agent

SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
Deny from env=HTTP_SAFE_BADBOT

Eu vou postando novas utilidades conforme a necessidade. Atualizado última vez 30/08/2012

Lucas Peperaio

Estudante de Ciência da Computação, trabalho com desenvolvimento web há 5 anos e com hardware há 8. Nas horas vagas, sou entusiasta de Overclock, Casemod e Benchmarks, além é claro dos Games. Apaixonado por informática e pela vida, procuro compartilhar meus conhecimentos e assim, ajudar as pessoas. Siga-me no youtube, posto semanalmente muito material sobre Hardware, tecnologia e games em geral: Clique aqui

Receba gratuitamente em seu E-mail
Novos artigos do meu Blog!


Após o Cadastro você receberá um Email Automático. Clique no link enviado para Ativar e receber as novidades.

Categorias do site





53 Comentários Deixe o seu

  1. Rafael

    Excelente, simples, fácil, sem palavras…

    • Lucas Peperaio

      Valeu amigo, em breve coloco aqui mais dicas sobre o .htaccess

  2. Felipe

    Muito bom! Parabéns!

  3. Bruno

    Parabéns cara, não encontrei um post completo igual a este!

  4. Bruno

    Lucas queria fazer o comando abaixo só que meu cliente esta com servidor IIS, como faço isso no web.config?

    Redirect 301 /página-a-ser-movida http://www.seusite.com.br/pagina-movida-para-ca

    Valeu

  5. Kaio Cesar

    Perfeito mano, nada mais a dizer, o post que eu estava procurando ;) Deus te abençoe irmão

  6. Warlisson Miranda

    Muitos parabéns!!

    Quem disse que este post é perfeito? Este post é mais que perfeito!!!

    Um abração!

  7. Max

    Amigo boa tarde. Muito boas suas dicas. Mas gostaria de saber se pode me ajudar com o seguinte.

    Tenho um site com arquivos .flv mas gostaria de restringir o acesso se a pessoa digitasse simplesmente: http://www.meusite.com.br/arquivo.flv

    Preciso que os arquivos ou o diretorio inteiro esteja acessivel somente após digitar usuário e senha. Meu site é em Joomla.

    Pode me ajudar? Obrigado Max

  8. Lucas Peperaio

    Max, o problema do Joomla, WordPress, Blogspot e qualquer outra plataforma pronta de desenvolvimento, é que você fica preso em certas funções. No caso de limitar o acesso, você teria que trabalhar com sessões. O usuário logado, teria permissão de leitura no diretório. O usuário não-logado sem permissão.

    Pra fazer isso é simples. Inicialmente, use a função CHMOD do PHP para tirar qualquer permissão do diretório dos arquivos FLV (CHMOD 700). Para o usuário logado, com uma sessão válida, faça o CHMOD novamente, dando permissão de leitura (CHMOD 744).

  9. eduardo

    cara, valeu!!!!!!!

    tava procurando isso há uma semana.

    muito bom!

  10. mix virtual

    Opa Lucas, tudo bem? Muito bom o artigo, bem útil para gerenciar as permissões do Apache. Valeu, abraço!

  11. Max

    Oi Lucas obrigado pelo retorno. Mas não consegui fazer essa configuração. Na verdade acho q não entendi bem. Poderias entrar em contato comigo pelo email? Gostaria de te ligar. É possível?

    “Pra fazer isso é simples. Inicialmente, use a função CHMOD do PHP para tirar qualquer permissão do diretório dos arquivos FLV (CHMOD 700). Para o usuário logado, com uma sessão válida, faça o CHMOD novamente, dando permissão de leitura (CHMOD 744).”

    • Lucas Peperaio

      Dá uma olhada nisso: http://php.net/manual/pt_BR/function.chmod.php

  12. Orlando

    Show de bola este post, curti e posteriormente vou acessar para ver mais informações.

  13. Junior

    Amigo, muito boas as dicas..

    Tenho enfrentado problemas com uns scripts poup em flash, com propagandas do YAHOO, já tentei de tudo mas não descobri…

    Tem como bloquear esses malditos via .htaccess? Eles aparecem aleatoriamente e em horarios diferentes.. uso o joomla..

    Não sei se é permitido, ou se ajuda.. estou colocando abaixo o codigo fonte do script que estava em uma das paginas que tinham os banners, mas agora já não tem mais…

    • Lucas Peperaio

      Olá Junior, infelizmente não posso te ajudar pois não tenho conhecimentos suficientes em flash. Mas para resolver, porque vc nao tira este script do seu site?

  14. Junior

    Olá Lucas,

    Esse poup aparece contra a minha vontade, deve ter alguma coisa no banco de dados do joomla ou então em algum arquivo que possibilita isso a alguem… Não aparece sempre. Caramba, é uma droga isso!

  15. Herbert Athayde de Souza

    Bom dia!

    Sou leigo no assunto!. Usei o page speed e ele pediu para aproveitar o cache do navegadorou coisa parecidada!. Acho que é uma das dicas postadas acima. Aonde no código fonte do blogger eu introduzo a sua dica (antes ou depois de qual tag).

    Grato!

    • Lucas Peperaio

      Olá amigo, recomendo que leia este artigo: http://lucaspeperaio.com/cache-de-navegador-com-htaccess
      Só é possível fazer cache no Blogger se a sua hospedagem for própria, caso o seu site seja um “.blogspot” não será possível

  16. Herbert Atahyde de Souza

    Olá para todos!

    Entre quais tags são colocados esses códigos. Sou iniciante no blogger.

    Grato!

  17. Lucas Peperaio

    Amigo, esses códigos não são inseridos em tags pelo painel de controle, e sim pelo FTP da hospedagem. Caso você não tenha acesso FTP ao seu site, você não conseguirá sequer criar um arquivo .htaccess

  18. Juan

    Obrigado Pelo post foi de grande ajuda estava precisando da função salvar cache do navegador.

    Obrigado Lucas Muito Bom Post Parabéns :)

    • Lucas Peperaio

      Olá Juan, aproveite e veja este guia de cache que eu publiquei:
      lucaspeperaio.com/cache-de-navegador-com-htaccess

  19. andre enrique

    Gostaria de saber se tem algum limite de redirecionamentos no .htaccess eu só posso fazer digamos 300 redirecionamentos? e outr questão é caso não tenha limite de redirecionamentos eu posso fazer 1000 o tempo de resposta e carregamento das paginas vai demorar

  20. E.Martins

    Boa tarde, estou tentando criar um redirecionamento com o .htaccess, é o seguinte quero que quando deslogar(sair) do email (webmaillogout.cgi) seja redirecionado para http://www.seusite.com/home, isso seria possivel através do htacess, meu servidor é linux ja encontrei o arquivo mais não sei o que fazer dentro do diretoria Public_html tem .htaccess.txt onde já tem alguma coisa ex: # -FrontPage-

    order deny,allow deny from all allow from all

    order deny,allow deny from all

    AuthUserFile /home/dominio/public_html/_vti_pvt/service.pwd AuthGroupFile /home/dominio/public_html/_vti_pvt/service.grp RewriteEngine on

    RewriteCond %{HTTP_REFERER} !^http://dominio.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://dominio.com$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.dominio.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.dominio.com$ [NC] RewriteRule .*\.(jpg|jpeg|gif|png|bmp)$ – [F,NC]

    AuthName dominio.com IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti* Tem solução meu problema pelo .htaccess?

    • Lucas Peperaio

      Amigo, o melhor a ser feito é redirecionar com PHP, pois se fizer com .htaccess, o Apache não irá executar o arquivo de logoff (webmaillogout.cgi). Basta fazer um Header(“Location: home”); no webmaillogout.cgi, após a execução do script.

  21. italo

    Meu amigo parabéns , seu post é de longe um dos melhores sobre o assunto que eu encontrei na internet , muito bom ! CTRL + D .

  22. Marcelo

    Excelente !!! Muito bom o leque de opções que o htacess nos proporciona de uma forma tão bem organizada e explicada, parabéns

  23. FABIO

    Artigo show … Me ajudou muito em muito primeiro site para internet !!!

    Abçs!

  24. Edilson Maia Faver

    Bom dia amigo, estou quebrando a cabeça para saber se existe um comando para alterar a frese “Index of /diretório” quando abro um diretório sem página index.html

    O que quero é apenas que exiba a lista dos arquivos com a frase “Lista de arquivos da pasta tal” Tipo uma tradução da frase original para português br (Já tentei forçar via comando a linguagem pt-BR e não mudou nada) fico muito grato se souber essa :)

    • Lucas Peperaio

      Tem como mudar sim, eu já fiz isso uma vez.
      Vou procurar aonde eu mechi e te respondo por aqui

    • Lucas Peperaio

      Veja se te ajuda:
      http://antisleep.com/indices/

  25. Aurélio

    Olá Lucas, bom dia! Li seu artigo, legal demais! Cara, tem uma dúvida e quem sabe você poderia me ajudar. Quero fazer o seguinte em meu site, ao invés de site.com/noticia#123 ele mostrar na barra de endereço site.com/noticia/post/123. Já li muita coisa sobre .htaccess na web para fazer isso mas sem sucesso até agora. Ficaria grato por sua ajuda! Valeu.

    • Lucas Peperaio

      Tente isso:
      RedirectMatch 301 /noticia#(.*)$ site.com/noticia/post/$1

  26. Guilherme Rossler

    boa Tarde.

    gostaria de saber se é possível bloquear por htaccess dessa forma:

    bloquear quando digitar na url: http://exemplo.com/imagem.jpg

    mas liberar se for por html:

    • Lucas Peperaio

      É possível sim, pesquise por htaccess jpg hotlink no google

  27. Edson

    Brother estou desenvolvendo um sistema de login que no meu servidor apache na minha maquina as sessões funcionam perfeitamente, porem na hospedagem que contratei para colocar meu site online, a sessão funciona na primeira pagina, quando você vai para a 2a pagina a sessão simplesmente não existe, sumiu, expirou ou sei la o que, deve ser alguma configuração do PHP.ini no servidor deles penso eu.

    Teria como resolver isso via .hacess?

    • Lucas Peperaio

      Antes de fazer o redirecionamento header( “Location” ), coloque session_commit().

  28. Allan Marcio

    Olá..meu caro Lucas tenho problamas sério de integração do Editor de Blogs Windowns Live Writer e WordPress nao consigo aparece sempre essa mensagem quando tento postar alguma coisa no Editor “”invalid response document returned from xmlrpc server” já tentei de tudo…gostaria de saber sua opiniao ou orientaçao?

    Att

    Allan Marcio

    • Lucas Peperaio

      Nem sabia desta integração, desculpe mas não posso te ajudar por falta de experiência

  29. Anderson

    Olá Lucas, descobri esse assunto a poucos dias, e estou quebrando a cabeça para conseguir retirar a extensão .html das páginas na URL, e seu post está sendo uma luz no fim do túnel. Bem organizado e direto ao ponto mostra-se uma excelente fonte de consulta e aprendizado, porém como ainda sou leigo no assunto, estou com a seguinte dúvida: No código “Retirar extensões da URL” é preciso acrescentar mais alguma coisa, pois criei o arquivo .htaccess e mandei para o servidor mas as extensões continuam aparecendo. Desde já agradeço por sua atenção e que Deus te abençoe.

    • Lucas Peperaio

      As extensões sempre continuarão aparecendo, o código que eu postei serve para habilitar o funcionamento da página mesmo sem a extensão. O que vc pode fazer é um redirecionamento “Redirect Math 301” da extensão para a página sem extensão

  30. André

    Amigo, bom dia. Poderia me ajudar? No meu site aparece a extensão “htm”, poderia me ajudar para retirar isso? Logo acima Eu vi a explicação, “RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.html -f RewriteRule ^(.*)$ $1.html #neste caso, estou retirando apenas o HTML”

    Em que linha Eu insiro o codigo, gostaria de saber como retiro o “HTM” Vai o exemplo: http://www.gamerbrasileiro.com/Diablo_3.htm

    Desde já agradeço a ajuda.

    • Lucas Peperaio

      Seu servidor é Windows (IIS) provavelmente este é o problema.

  31. Marcio

    Lucas,

    Redirecionei meu site para uma pasta: “exemplo.com.br” para “exemplo.com.br/site”.

    Porém ele está redirecionando o arquivo robots.txt da raiz também.

    Tem alguma forma de não redirecionar esse arquivo específico?

    Obrigado

    • Lucas Peperaio

      Você está redirecionando tudo, o correto seria redirecionar tudo menos o robots.
      Poste como está suas regras e eu tentarei ajudá-lo

      • Marcio

        Olá Lucas,

        Segue a regra:

        Options +FollowSymLinks RewriteEngine On

        RewriteCond %{REQUEST_URI} ^/ RewriteRule ^.*$ “http\:\/\/www\.meusite\.com\.br\/exemplo” [R=301,L]

        O robots.txt está na raiz: http://www.meusite.com.br

        Obrigado

  32. Giovana

    Excelente artigo, parabéns!

  33. john tejada

    cara estou apanhando para remover a extensão .html do meu site, no entanto usei o código para remover o index e funcionou de boa, mas quando usei o código para remover o .html não vai e o meu site fica assim: http://www.meusite.com.br/contato.html como resolvo isso?

  34. Claudiney Walter

    Dr., belo post e site, só acho que faltou uma questão do .htaccess, se tiver no post passou despercebido, impedir o acesso direto aos scripts http://office.site.com.br/login.php, depois que foi usada a reescrita da URL.

    Como o desse site:

    http://escritorio.vamopracima.com.br/login

    Não funcionando assim

    http://escritorio.vamopracima.com.br/login.php –> File not found.

  35. Vitor Saulo

    Muito bom o material

  36. erick goes

    to com um problema, o meu site tera videos postados e tenho que proteger o diretorio de acesso externo e se possivel encryptar o URL do video e não tenho ideia de como fazer isso?

  37. Cícero Joceilton

    Olá gostei da explicação queria saber se tem como fazer com que só o usuario logado podesse baixar o arquivo e que esteja ativo no meu sistema ou seja que tenha pago a taxa via pagseguro. Como posso acessar informacoes assim com htaccess?