{"id":56,"date":"2011-01-14T18:21:00","date_gmt":"2011-01-14T18:21:00","guid":{"rendered":"http:\/\/artigos.marcomapa.com\/?p=56"},"modified":"2011-09-11T19:23:04","modified_gmt":"2011-09-11T19:23:04","slug":"o-arquivo-htaccess","status":"publish","type":"post","link":"https:\/\/marcomapa.com\/artigos\/o-arquivo-htaccess\/","title":{"rendered":"O arquivo .htaccess"},"content":{"rendered":"<p>Arquivos .htaccess, tamb\u00e9m conhecidos como arquivos de configura\u00e7\u00e3o distribu\u00edda, oferecem meios para modificar as configura\u00e7\u00f5es de diret\u00f3rios. O .htaccess \u00e9 usado com frequ\u00eancia para bloquear acessos n\u00e3o autorizados, bloquear IPs, impedir listagens de diret\u00f3rios, criar redirecionamentos e evitar o chamado \"hot-linking\".<\/p>\n<p>Introdu\u00e7\u00e3o<\/p>\n<p>O .htaccess \u00e9 um arquivo de configura\u00e7\u00e3o usado exclusivamente pelo servidor web Apache. Como o Apache domina amplamente o ambiente web, vale a pena conhecer este arquivo e seu imenso potencial. Um arquivo deste tipo, contendo uma ou mais diretrizes de configura\u00e7\u00e3o, pode ser colocado num diret\u00f3rio em particular para que suas diretrizes sejam aplicadas no diret\u00f3rio que cont\u00e9m o arquivo, assim como em todos os seu subdiret\u00f3rios.<\/p>\n<p>Se voc\u00ea hospeda seu site num servidor Linux com webserver Apache, existe uma boa probabilidade do seu hospedeiro ter disponibilizado seu acesso a arquivos .htaccess. Se voc\u00ea optou por um servidor Windows, pode esquecer... nunca vi um servidor Windows usando o webserver Apache <\/p>\n<p>Bem, partindo do pressuposto que a dupla din\u00e2mica Linux+Apache esteja \u00e0 sua disposi\u00e7\u00e3o, a primeira coisa \u00e9 descobrir se voc\u00ea tem permiss\u00e3o para usar o .htaccess. Geralmente o servi\u00e7o de hospedagem informa explicitamente esta permiss\u00e3o ou d\u00e1 indica\u00e7\u00f5es indiretas do tipo \"p\u00e1ginas de erro 404 personalizadas\" ou \"prote\u00e7\u00e3o de diret\u00f3rios com senha\". Se voc\u00ea tiver d\u00favidas, pe\u00e7a informa\u00e7\u00f5es ao seu hospedeiro ou ent\u00e3o crie seu pr\u00f3prio arquivo .htaccess, transfira-o para um diret\u00f3rio do seu site e teste-o: funcionou, est\u00e1 liberado <\/p>\n<p>O nome deste arquivo \u00e9 um pouco estranho. Ali\u00e1s, parece que n\u00e3o tem nome - parece ser identificado apenas como uma extens\u00e3o. Na verdade, o nome do arquivo \u00e9 htaccess e o ponto antes do nome serve para indicar ao sistema Linux que se trata de um arquivo oculto (hidden). Portanto, se voc\u00ea criar seu .htaccess particular, n\u00e3o invente. Cham\u00e1-lo de arquivo.htaccess ou alguma p\u00e1gina.htaccess n\u00e3o vai funcionar! O motivo \u00e9 o seguinte: existe um arquivo de configura\u00e7\u00e3o do servidor Apache no qual o nome dos arquivos de configura\u00e7\u00e3o distribu\u00edda s\u00e3o definidos. Neste arquivo de configura\u00e7\u00e3o existe uma diretiva que diz AccessFileName .htaccess e os servi\u00e7os de hospedagem mant\u00eam este nome padr\u00e3o para n\u00e3o dar n\u00f3 na cabe\u00e7a dos seus clientes. \u00c9 claro que o \"dono\" do servidor web pode mudar esta diretiva para, por exemplo, AccessFileName .config. Neste caso voc\u00ea precisa desta informa\u00e7\u00e3o para criar arquivos de configura\u00e7\u00e3o distribu\u00edda no seu site: ao inv\u00e9s de .htaccess, o nome destes arquivos teria que ser .config.<\/p>\n<p>Criando arquivos .htaccess<\/p>\n<p>O .htaccess \u00e9 um arquivo ASCII. Use seu editor de texto preferido certificando-se de que esteja com o rearranjo de linhas (word wrap) desativado para evitar a inclus\u00e3o de caracteres de quebra de linha, geralmente n\u00e3o vis\u00edveis, que poder\u00e3o gerar erros. Se voc\u00ea usar o Bloco de Notas do Windows, cuidado quando for salvar seu arquivo: como padr\u00e3o, este editor de texto adiciona a extens\u00e3o .txt e um arquivo com o nome .htaccess.txt n\u00e3o vai ser reconhecido pelo Apache.<\/p>\n<p>Leia com aten\u00e7\u00e3o as diretrizes do Apache, em especial as do .htaccess, de prefer\u00eancia na fonte (nas Fontes de Refer\u00eancia desta p\u00e1gina voc\u00ea encontra um link para o site oficial do Apache). Coloque cada uma das diretrizes em UMA LINHA pr\u00f3pria. Confira cuidadosamente a sintaxe - aten\u00e7\u00e3o especial para aspas e caminhos (path).<\/p>\n<p>De in\u00edcio, implemente uma diretriz por vez: crie o arquivo, fa\u00e7a o upload e teste. Deu caca? Neste caso, ou h\u00e1 erros de sintaxe ou seu servidor n\u00e3o permite o uso da diretriz em quest\u00e3o (ela pode estar bloqueada no arquivo de configura\u00e7\u00e3o principal do Apache). Volte para a vers\u00e3o anterior e continue seu trabalho. No in\u00edcio \u00e9 penoso, mas este procedimento permite estabelecer as limita\u00e7\u00f5es impostas pelo seu servidor e faz com que voc\u00ea se familiarize com o funcionamento dos arquivos de configura\u00e7\u00e3o distribu\u00edda.<\/p>\n<p>O upload de arquivos .htaccess precisa ser no modo ASCII, n\u00e3o no modo BINARY. Ap\u00f3s o upload, verifique se a permiss\u00e3o \u00e9 644 (RW-R--R--). Isto faz com que o arquivo possa ser usado pelo servidor mas evita que seja lido pelo browser (o que comprometeria seriamente a seguran\u00e7a).<\/p>\n<p>N\u00e3o saia na louca pondo arquivos .htaccess em tudo que for diret\u00f3rio. V\u00e1 com calma. Analise inicialmente sua real necessidade e sua melhor localiza\u00e7\u00e3o, implemente um arquivo por vez e TESTE tudo antes de continuar. Lembre-se que arquivos .htaccess atuam sobre o diret\u00f3rio onde est\u00e3o localizados e sobre todos os respectivos subdiret\u00f3rios. Isto significa que, colocando um .htaccess no diret\u00f3rio raiz, todos os diret\u00f3rios do site ser\u00e3o afetados. Digamos que exista um .htaccess no diret\u00f3rio raiz atuando sobre todos os outros diret\u00f3rios e que voc\u00ea quer definir propriedades diferentes para o diret\u00f3rio raiz\/texto\/escondido\/. Neste caso, crie o arquivo desejado e coloque-o no diret\u00f3rio \/escondido. Este \u00faltimo tomar\u00e1 o lugar do que est\u00e1 no diret\u00f3rio raiz.<\/p>\n<p>\u00c9 necess\u00e1rio um cuidado especial quando se usa m\u00faltiplos arquivos .htaccess. A coisa mais f\u00e1cil \u00e9 criar loops infinitos, que \"penduram\" o servidor. Por exemplo, voc\u00ea redireciona uma p\u00e1gina para outra que esteja num diret\u00f3rio que redireciona a referida p\u00e1gina novamente para a p\u00e1gina original... j\u00e1 viu, n\u00e9?<\/p>\n<p>Nos t\u00f3picos seguintes voc\u00ea encontra alguns exemplos de uso de arquivos de configura\u00e7\u00e3o distribu\u00edda. Talvez isto facilite um pouco as coisas, mas n\u00e3o encare os exemplos como \"prato pronto\" porque, a n\u00e3o ser que voc\u00ea possa \"pilotar\" seu servidor, tem aquela hist\u00f3ria da configura\u00e7\u00e3o central do Apache.<\/p>\n<p>Mudar a p\u00e1gina default<\/p>\n<p>DirectoryIndex \u00e9 a diretriz que permite especificar qual arquivo deve ser carregado quando chegar uma solicita\u00e7\u00e3o de diret\u00f3rio ou URL que n\u00e3o especifique uma p\u00e1gina em particular (tipo http:\/\/www.numaboa.com\/). Normalmente a p\u00e1gina default \u00e9 index.html e a chamada do exemplo \u00e9 transformada em http:\/\/www.numaboa.com\/index.html. Se voc\u00ea quiser mudar as regras do jogo, n\u00e3o tem problema:<\/p>\n<p>DirectoryIndex adoropizza.html<\/p>\n<p>Se o seu .htaccess estiver no diret\u00f3rio raiz, esta diretriz faz com que a p\u00e1gina default de todos os diret\u00f3rios do seu site passe a ser adoropizza.html. Tem mais. Se voc\u00ea quiser usar outras p\u00e1ginas (ou at\u00e9 scripts) como default, basta adicionar as refer\u00eancias a gosto:<\/p>\n<p>DirectoryIndex adoropizza.html index.php home.htm index.cgi index.pl<\/p>\n<p>A linha acima, se o arquivo .htaccess estiver no diret\u00f3rio raiz, faz com que a procura da p\u00e1gina default siga a lista especificada: adoropizza.html \u00e9 a primeira a ser procurada; se for encontrada, ela \u00e9 enviada para o usu\u00e1rio e a procura p\u00e1ra por a\u00ed; se n\u00e3o for encontrada, index.php \u00e9 a pr\u00f3xima... e assim por diante, at\u00e9 index.pl. Caso nenhum dos arquivos relacionados seja encontrado, a\u00ed entra o famigerado erro 404.<\/p>\n<p>Lembre-se que todos os diret\u00f3rios abaixo do diret\u00f3rio raiz obedecem as regras ditadas pelo primeiro .htaccess acima deles, a n\u00e3o ser que o diret\u00f3rio possua seu pr\u00f3prio .htaccess. Se n\u00e3o existirem outros .htaccess em subdiret\u00f3rios, para todos os diret\u00f3rios do site vale o .htaccess do diret\u00f3rio raiz - as p\u00e1ginas default ser\u00e3o sempre as mesmas.<\/p>\n<p>Mesmo n\u00e3o personalizando um .htaccess pr\u00f3prio, as p\u00e1ginas default costumam ser index.html, index.htm, default.html, default.htm, etc, porque o pessoal do servi\u00e7o de hospedagem j\u00e1 fez esta configura\u00e7\u00e3o inicial no Apache.<\/p>\n<p>J\u00e1 usei este expediente para \"proteger\" alguns diret\u00f3rios que continham gr\u00e1ficos, midis ou scripts. Como n\u00e3o queria que fossem listados, colocava um .htaccess no diret\u00f3rio alvo indicando uma p\u00e1gina inexistente: Tchan! erro 404! Solu\u00e7\u00e3o pouco elegante, mas eficaz. Eu disse \"usei\", n\u00e3o uso mais. Hoje utilizo redirecionamentos ou scripts PHP.<\/p>\n<p>Documentos de erro<\/p>\n<p>Provavelmente a aplica\u00e7\u00e3o mais conhecida do arquivo .htaccess seja direcionar usu\u00e1rios para p\u00e1ginas de erro personalizadas. Digamos que um usu\u00e1rio solicite uma p\u00e1gina inexistente - ele recebe a p\u00e1gina padr\u00e3o do sistema do seu servidor avisando-o do ocorrido. Para personalizar seu site, \u00e9 poss\u00edvel criar suas pr\u00f3prias p\u00e1ginas de erro e, quando for o caso, direcionar os usu\u00e1rios para elas.<\/p>\n<p>Para criar suas pr\u00f3prias p\u00e1ginas de erro \u00e9 necess\u00e1rio conhecer os c\u00f3digos de erro retornados pelo servidor. Nas tabelas abaixo voc\u00ea encontra todos os c\u00f3digos de erro atualmente padronizados. \u00c9 claro que n\u00e3o h\u00e1 necessidade de fazer p\u00e1ginas para cada um deles... na verdade, voc\u00ea nem deveria. Um documento de erro para o c\u00f3digo 200 causaria um loop infinito cada vez que uma p\u00e1gina fosse encontrada - uma nhaca!<\/p>\n<p>Erros de Requisi\u00e7\u00f5es de Cliente<\/p>\n<p>400 Requisi\u00e7\u00e3o viciada (Bad Request) 408 Requisi\u00e7\u00e3o com tempo vencido (Request Timed Out)<\/p>\n<p>401 Requer autoriza\u00e7\u00e3o (Authorization Required) 409 Requisi\u00e7\u00e3o conflitante (Conflicting Request)<\/p>\n<p>402 Requer pagamento (Payment Required) *ainda n\u00e3o usada 410 Acabou (Gone)<\/p>\n<p>403 IProibido (Forbidden) 411 Requer comprimento do conte\u00fado (Content Length Required)<\/p>\n<p>404 N\u00e3o encontrado (Not Found) 412 Falha na precondi\u00e7\u00e3o (Precondition Failed)<\/p>\n<p>405 M\u00e9todo n\u00e3o permitido (Method Not Allowed) 413 Entidade requerida muito longa (Request Entity Too Long)<\/p>\n<p>406 N\u00e3o aceit\u00e1vel (codifica\u00e7\u00e3o) (Not Acceptable (encoding)) 414 URI requerida muito longa (Request URI Too Long)<\/p>\n<p>407 Requer autentica\u00e7\u00e3o proxy (Proxy Authentication Required ) 415 Tipo de m\u00eddia n\u00e3o suportado (Unsupported Media Type)<\/p>\n<p>Requisi\u00e7\u00f5es de Cliente bem sucedidas<\/p>\n<p>200 OK<\/p>\n<p>201 Criado (Created)<\/p>\n<p>202 Aceito (Accepted)<\/p>\n<p>203 Informa\u00e7\u00e3o n\u00e3o autorativa (Non-Authorative Information)<\/p>\n<p>204 Sem conte\u00fado (No Content)<\/p>\n<p>205 Conte\u00fado resetado (Reset Content)<\/p>\n<p>206 Conte\u00fado parcial (Partial Content)<\/p>\n<p>Requisi\u00e7\u00f5es de Cliente redirecionadas<\/p>\n<p>300 Escolhas m\u00faltiplas (Multiple Choices)<\/p>\n<p>301 Mudado permanentemente (Moved Permanently)<\/p>\n<p>302 Mudado temporariamente (Moved Temporarily)<\/p>\n<p>303 Veja outras (See Other)<\/p>\n<p>304 N\u00e3o modificado (Not Modified)<\/p>\n<p>305 Use Proxy (Use Proxy)<\/p>\n<p>Erros do Servidor<\/p>\n<p>500 Erro interno do servidor (Internal Server Error)<\/p>\n<p>501 N\u00e3o implementado (Not Implemented)<\/p>\n<p>502 Gateway viciado (Bad Gateway)<\/p>\n<p>503 Servi\u00e7o n\u00e3o dispon\u00edvel (Service Unavailable)<\/p>\n<p>504 Gateway com tempo vencido (Gateway Timeout)<\/p>\n<p>505 Vers\u00e3o HTTP n\u00e3o suportada (HTTP Version Not Supported)<\/p>\n<p>Geralmente cria-se documentos de erro para os c\u00f3digo 404 e 500, para p\u00e1ginas n\u00e3o encontradas e para poder controlar erros internos do servidor em scripts que estejam sendo utilizados. Tamb\u00e9m \u00e9 interessante personalizar o erro 401 - Autoriza\u00e7\u00e3o Requerida - quando se tem \u00e1reas protegidas e o erro 403 - Proibido - quando se tem arquivos com permiss\u00e3o de uso bloqueada. Outra possibilidade seria tratar o erro 400 - Requisi\u00e7\u00e3o Viciada - para capturar erros em scripts ou URLs malucas que um usu\u00e1rio possa tentar usar.<\/p>\n<p>Para especificar seus pr\u00f3prios documentos de erro, tudo o que voc\u00ea precisa \u00e9 adicionar a seguinte diretriz, em UMA LINHA, no seu arquivo .htaccess:<\/p>\n<p>ErrorDocument code \/diretorio\/nomearquivo.ext<\/p>\n<p>ou<\/p>\n<p>ErrorDocument 404 \/erros\/naoencontrado.html<\/p>\n<p>e, de forma an\u00e1loga,<\/p>\n<p>ErrorDocument 500 \/erros\/errointerno.html<\/p>\n<p>Pode-se usar qualquer nome para os documentos de erro - para facilitar, recomendo que lembrem a fun\u00e7\u00e3o dos mesmos - e coloc\u00e1-los em qualquer diret\u00f3rio que seja acess\u00edvel pela web atrav\u00e9s de uma URL. A primeira barra corresponde ao diret\u00f3rio raiz do site. Pessoalmente prefiro mant\u00ea-los num diret\u00f3rio pr\u00f3prio para facilitar a manuten\u00e7\u00e3o e para poder controlar spiders indexando estas p\u00e1ginas atrav\u00e9s de um arquivo ROBOTS.TXT.<\/p>\n<p>Na hip\u00f3tese de capturar todos os erros acima mencionados e direcionar o usu\u00e1rio para p\u00e1ginas espec\u00edficas, o arquivo .htaccess teria a seguinte configura\u00e7\u00e3o:<\/p>\n<p>ErrorDocument 400 \/erros\/request.html<\/p>\n<p>ErrorDocument 401 \/erros\/authreqd.html<\/p>\n<p>ErrorDocument 403 \/erros\/forbid.html<\/p>\n<p>ErrorDocument 404 \/erros\/notfound.html<\/p>\n<p>ErrorDocument 500 \/erros\/serverr.html<\/p>\n<p>N\u00e3o se esque\u00e7a de que cada diretriz precisa estar numa linha \u00fanica pr\u00f3pria. Pode-se tamb\u00e9m especificar um endere\u00e7o URL completo, como por exemplo http:\/\/seusite.com\/erros\/notfound.html, apesar de que a forma padr\u00e3o \u00e9 o endere\u00e7amento relativo como mostrado acima.<\/p>\n<p>Acredite ou n\u00e3o, mas voc\u00ea tamb\u00e9m pode especificar HTML!<\/p>\n<p>ErrorDocument 401 \"body bgcolor=#ffffff&gt;<\/p>\n<p>h1&gt;<\/p>\n<p>Voc\u00ea precisa b&gt;SER\/b&gt; um a href=\" #\"&gt;usu\u00e1rio registrado\/a&gt;<\/p>\n<p>para ver esta p\u00e1gina!<\/p>\n<p>\/h1&gt;<\/p>\n<p>Observe que, logo no in\u00edcio do c\u00f3digo HTML, existem aspas. Observe tamb\u00e9m que, no final do c\u00f3digo HTML, n\u00e3o h\u00e1 aspas. \u00c9 assim mesmo que deve ser feito e, lembre-se, tudo numa \u00fanica linha sem word wrap! Apesar de existir esta op\u00e7\u00e3o, voc\u00ea tem muito mais controle sobre p\u00e1ginas de erro quando usadas em conjunto com xSSI, CGI ou ambos. Eu uso, por exemplo, uma p\u00e1gina de erro 404 que, al\u00e9m da mensagem para o usu\u00e1rio, cont\u00e9m c\u00f3digo PHP que me envia um e-mail com a indica\u00e7\u00e3o do documento faltante toda vez que uma p\u00e1gina n\u00e3o \u00e9 encontrada. Este c\u00f3digo pode ser ativado\/desativado com facilidade, assim posso monitorar o site pelo tempo que quiser.<\/p>\n<p>Bem, para p\u00e1ginas personalizadas de erro isto \u00e9 tudo. Experimente e divirta-se. \u00c9 claro que um arquivo .htaccess com estas diretrizes deve ficar preferencialmente no diret\u00f3rio raiz para que possa capturar poss\u00edveis erros em qualquer setor do site.<\/p>\n<p>Redirecionamento<\/p>\n<p>Voc\u00ea j\u00e1 passou pelo sufoco de mudar por\u00e7\u00f5es significantes do seu site e depois ter que lidar com o problema das pessoas procurando p\u00e1ginas antigas que foram substitu\u00eddas? Depois do trabalh\u00e3o que teve para divulgar o site e coloc\u00e1-lo em mecanismos de busca, ser\u00e1 que ficou tudo perdido?<\/p>\n<p>A resposta \u00e9 n\u00e3o, porque existe o redirecionamento. Existem v\u00e1rias maneiras de redirecionar p\u00e1ginas: atrav\u00e9s de http-equiv, javascript ou qualquer linguagem server-side como Perl, PHP, etc. Acontece que tamb\u00e9m \u00e9 poss\u00edvel fazer redirecionamentos atrav\u00e9s do arquivo .htaccess, provavelmente o mais eficiente considerando o pouco trabalho requerido.<\/p>\n<p>O .htaccess usa Redirect para controlar qualquer solicita\u00e7\u00e3o para uma p\u00e1gina espec\u00edfica (ou uma localiza\u00e7\u00e3o n\u00e3o espec\u00edfica que, infelizmente, leva a loops infinitos com certa facilidade). Se encontrar a dita solicita\u00e7\u00e3o, ele a redireciona para a p\u00e1gina que voc\u00ea especificou:<\/p>\n<p>Redirect \/dirAntigo\/arqAntigo.html http:\/\/seusite.com.br\/dirNovo\/arqNovo.html<\/p>\n<p>Note que a diretriz possui 3 partes que precisam estar numa mesma linha: o comando Redirect, a localiza\u00e7\u00e3o do arquivo\/diret\u00f3rio que voc\u00ea quer redirecionar relativa ao diret\u00f3rio raiz do seu site (\/dirAntigo\/arqAntigo.html corresponde a seusite.com.br\/dirAntigo\/arqAntigo.html) e a URL completa para onde a solicita\u00e7\u00e3o deve ser redirecionada. Cada uma das 3 partes \u00e9 separada por UM espa\u00e7o, mas tudo em uma \u00fanica linha. Voc\u00ea tamb\u00e9m pode redirecionar um diret\u00f3rio inteiro usando simplesmente <\/p>\n<p>Redirect \/dirAntigo http:\/\/seusite.com.br\/dirNovo\/<\/p>\n<p>Usando este segundo m\u00e9todo, voc\u00ea pode redirecionar todo o conte\u00fado do diret\u00f3rio, independente do que voc\u00ea fizer com a sua estrutura de diret\u00f3rios. \u00c9 o m\u00e9todo de efeito global mais r\u00e1pido que existe.<\/p>\n<p>Impedir listagem de diret\u00f3rios<\/p>\n<p>Se voc\u00ea tem diret\u00f3rios repletos de gr\u00e1ficos, arquivos zip, mp3, etc e n\u00e3o quer que os usu\u00e1rios possam simplesmente listar estes diret\u00f3rios, existem v\u00e1rias op\u00e7\u00f5es. Se a possibilidade de listar diret\u00f3rios j\u00e1 n\u00e3o estiver desabilitada pelo seu servi\u00e7o de hospedagem, voc\u00ea pode criar arquivos index.html, vazios ou n\u00e3o, e coloc\u00e1-los em cada um dos diret\u00f3rios que n\u00e3o devem ser listados ou, mais uma vez, fazer uso do .htaccess: <\/p>\n<p>IndexIgnore *<\/p>\n<p>O asterisco \u00e9 um coringa indicando que todo e qualquer arquivo N\u00c3O deve ser listado. Bingo! Se o arquivo .htaccess for colocado no diret\u00f3rio raiz, nenhum diret\u00f3rio poder\u00e1 ser listado.<\/p>\n<p>Por outro lado, se voc\u00ea quiser especificar o tipo de arquivo que n\u00e3o deve ser listado, fa\u00e7a o seguinte:<\/p>\n<p>IndexIgnore *.gif *.jpg *.mp3<\/p>\n<p>Neste caso, arquivos como .html, .txt, etc ser\u00e3o listados normalmente. Os .gif, .jpg e .mp3 n\u00e3o ser\u00e3o mostrados.<\/p>\n<p>Agora, na situa\u00e7\u00e3o oposta: seu servidor n\u00e3o permite a listagem de diret\u00f3rios mas voc\u00ea quer que o fa\u00e7a. Adicione o seguinte:<\/p>\n<p>Options +Indexes<\/p>\n<p>Se voc\u00ea usar esta op\u00e7\u00e3o, cuidado para n\u00e3o colocar qualquer arquivo comprometedor nos diret\u00f3rios atingidos pelo .htaccess. Voc\u00ea j\u00e1 deve ter percebido: o sinal mais (+) antes de Indexes for\u00e7a a listagem, ent\u00e3o, Options -Indexes bloqueia inteiramente a listagem. \u00c9 como o servidor Apache deveria estar configurado, o que nem sempre \u00e9 o caso...<\/p>\n<p>Se a listagem for permitida, ent\u00e3o voc\u00ea pode mostrar que \u00e9 um expert no assunto. Crie um arquivo com o nome HEADER, ponha nele a descri\u00e7\u00e3o da listagem e coloque no diret\u00f3rio alvo. O texto deste arquivo ser\u00e1 mostrado antes da listagem do conte\u00fado do diret\u00f3rio. Tamb\u00e9m \u00e9 poss\u00edvel criar um rodap\u00e9, que deve ter o nome de README. O conte\u00fado deste arquivo, que deve estar no mesmo diret\u00f3rio, \u00e9 mostrado logo ap\u00f3s a listagem do conte\u00fado.<\/p>\n<p>Bloqueio de IP e dom\u00ednios<\/p>\n<p>Tem um abelhudo infernizando a sua vida? Bisbilhotando seu site e dando trabalho? Bloqueio nele!<\/p>\n<p>Adicione o seguinte c\u00f3digo no seu arquivo .htaccess (logicamente mudando os IPs para os desejados), cada diretriz numa linha pr\u00f3pria e tomando cuidado para manter as mai\u00fasculas e as min\u00fasculas:<\/p>\n<p>Order Allow,Deny<\/p>\n<p>Deny from 123.45.6.7<\/p>\n<p>Deny from 012.34.5.<\/p>\n<p>Allow from all<\/p>\n<p>A linha Order Allow,Deny indica a ordem na avalia\u00e7\u00e3o das permiss\u00f5es (Allow) e das recusas (Deny). A op\u00e7\u00e3o \u00e9 Allow,Deny e, neste caso, primeiramente todas as recusas s\u00e3o analisadas. Se alguma delas for verdadeira, a solicita\u00e7\u00e3o \u00e9 rejeitada; caso contr\u00e1rio, as permiss\u00f5es passam a ser analisadas.<\/p>\n<p>Pode-se recusar endere\u00e7os IP ou blocos de endere\u00e7os IP. O c\u00f3digo acima nega acesso ao site se as requisi\u00e7\u00f5es vierem do endere\u00e7o IP 123.45.6.7 ou de qualquer subdom\u00ednio do bloco IP 012.34.5. (012.34.5.1, 012.34.5.2, 012.34.5.3, etc). Imagine s\u00f3, com a segunda op\u00e7\u00e3o voc\u00ea pode at\u00e9 bloquear acessos vindos de determinado pa\u00eds. Coisa de louco...<\/p>\n<p>\u00c9 claro que, se quiser, pode bloquear o acesso de todos usando Deny from all ao inv\u00e9s de Allow from all, mas isto n\u00e3o seria muito l\u00f3gico - a n\u00e3o ser que queira fechar para balan\u00e7o <\/p>\n<p>Nem s\u00f3 de endere\u00e7os IP vive o bloqueio. Voc\u00ea tamb\u00e9m pode usar nomes de dom\u00ednios, por exemplo, Allow from .numaboa.com ou Deny from www.pentelho.com.br. O primeiro libera www.numaboa.com, sub1.numaboa.com, etc. O segundo bloqueia apenas o que vier de www.pentelho.com.br.<\/p>\n<p>Evitar hot linking<\/p>\n<p>Na comunidade webmaster, \"hot linking\" \u00e9 uma express\u00e3o amaldi\u00e7oada. Tamb\u00e9m conhecido como \"roubo de banda\" (bandwidth stealing), refere-se a links apontando diretamente para objetos n\u00e3o-html em servidores que n\u00e3o sejam do propriet\u00e1rio do site. Geralmente s\u00e3o gr\u00e1ficos, arquivos de javascript e de flash referenciados a partir de um site concorrente. O servidor da v\u00edtima \u00e9 espoliado em largura de banda uma vez que o safado se diverte mostrando o conte\u00fado de uma \u00e1rea que n\u00e3o lhe pertence. O tipo mais comum de roubo de banda \u00e9 de imagens gr\u00e1ficas.<\/p>\n<p>Com o .htaccess \u00e9 poss\u00edvel impedir o hot linking de modo que os que tentarem roubar imagens hospedadas no seu site recebam uma \"porta\" (the door - uma imagem quebrada) ou caiam na \"boca do le\u00e3o\" (the lion's mouth - uma imagem \u00e0 sua escolha, hehehe). Tem apenas um pequeno sen\u00e3o: seu servidor precisa ter o mod_rewrite instalado e habilitado. Consulte seu servi\u00e7o de hospedagem para confirmar.<\/p>\n<p>Explicado o assunto, veja a seguir como desabilitar o hot linking de imagens no seu site. Simplesmente adicione o c\u00f3digo a seguir num arquivo .htaccess e fa\u00e7a o upload para o diret\u00f3rio que desejar:<\/p>\n<p>\u2018RewriteEngine onRewriteCond %{HTTP_REFERER}<\/p>\n<p>\u2018!^$RewriteCond %{HTTP_REFERER} !^http:\/\/(www\\.)?seudominio.com\/.*$ \u2018[NC]\n<p>\u2018RewriteRule \\.(gif<br \/>jpg)$ - [F]\n<p>Certifique-se de ter trocado \"seudominio.com\" pelo seu verdadeiro dom\u00ednio. O c\u00f3digo acima faz com que a imagem fornecida apare\u00e7a quebrada. Se voc\u00ea preferir determinar a imagem que deve substituir a solicitada atrav\u00e9s de uma hot link, acrescente o seguinte:<\/p>\n<p>\u2018RewriteEngine onRewriteCond %{HTTP_REFERER}<\/p>\n<p>\u2018!^$RewriteCond %{HTTP_REFERER} !^http:\/\/(www\\.)?seudominio.com\/.*$ \u2018[NC]\n<p>\u2018RewriteRule \\.(gif<br \/>jpg)$ http:\/\/www.seudominio.com\/porcaria.gif [R,L]\n<p>O efeito do c\u00f3digo acima \u00e9 fornecer a imagem \"porcaria.gif\" ao inv\u00e9s da solicitada. Do mesmo modo, troque \"seudominio.com\" pelo nome correto.<\/p>\n<p>Server Side Includes - SSI<\/p>\n<p>SSI vem de Server Side Includes que, traduzido livremente, significa incluir o lado do servidor. Se o seu servi\u00e7o de hospedagem n\u00e3o tiver ativado o SSI para o seu site e voc\u00ea quiser fazer uso do servi\u00e7o, \u00e9 poss\u00edvel ativ\u00e1-lo atrav\u00e9s do .htaccess.<\/p>\n<p>AVISO IMPORTANTE: obtenha uma PERMISS\u00c3O do seu hospedeiro antes de ativar o SSI atrav\u00e9s do .htaccess. Pode ser considerado \"hacking\" e uma viola\u00e7\u00e3o do contrato de hospedagem o fato de voc\u00ea fazer a ativa\u00e7\u00e3o sem a devida autoriza\u00e7\u00e3o. Melhor prevenir do que tentar remediar...<\/p>\n<p>Para ativar o SSI, inclua as seguintes diretrizes no seu arquivo .htaccess:<\/p>\n<p>AddType text\/html .shtml<\/p>\n<p>AddHandler server-parsed .shtml<\/p>\n<p>Options Indexes Follow<\/p>\n<p>SymLinks Includes<\/p>\n<p>A primeira linha indica ao servidor que p\u00e1ginas com a extens\u00e3o .shtml (para HTML analisado pelo servidor) seja v\u00e1lida: AddType text\/html .shtml<\/p>\n<p>A segunda linha adiciona um manipulador (handler), na verdade o bit SSI, em todos os arquivos com a extens\u00e3o .shtml. AddHandler server-parsed .shtml diz para o servidor que todas as p\u00e1ginas com nome .shtml devem ser analisadas para verificar a exist\u00eancia de comandos de servidor e, caso existam, devem ser executados.<\/p>\n<p>A \u00faltima linha s\u00e3o apenas tranqueiras t\u00e9cnicas, mas que precisam constar para completar a ativa\u00e7\u00e3o. A diretriz Options diz quais a\u00e7\u00f5es do servidor devem ser disponibilizadas. Minha sugest\u00e3o \u00e9 que voc\u00ea d\u00ea uma espiada no SSI na documenta\u00e7\u00e3o do Apache - escolha a vers\u00e3o certa do webserver!<\/p>\n<p>Prontinho -- seu SSI deve estar ativado. Mas agora n\u00e3o pense que ser\u00e1 necess\u00e1rio mudar o nome de todas as p\u00e1ginas do seu site! Use um expediente mais inteligente... e transforme todas as p\u00e1ginas .html em analis\u00e1veis adicionando a linha destacada em negrito:<\/p>\n<p>AddType text\/html .shtml<\/p>\n<p>AddHandler server-parsed .html<\/p>\n<p>AddHandler server-parsed .shtml<\/p>\n<p>Options Indexes Follow<\/p>\n<p>SymLinks Includes<\/p>\n<p>Como tudo tem seu pre\u00e7o, aqui vai outro ALERTA: AddHandler server-parsed .html for\u00e7ar\u00e1 a procura de comandos SSI em TODAS as p\u00e1ginas .html, mesmo as que n\u00e3o possuam comandos de servidor. Se voc\u00ea exagerar no uso de SSI no seu site, \u00e9 claro que voc\u00ea vai estressar o servidor. O SSI faz com que o servidor fique mais lento porque ele acaba realizando muito mais tarefas para servir uma p\u00e1gina analisada. Para os usu\u00e1rios, a diferen\u00e7a \u00e9 praticamente impercept\u00edvel, mas para o servidor...<\/p>\n<p>Por outro lado, h\u00e1 profissionais da \u00e1rea que preferem \"esconder\" que estejam utilizando SSI e usam o expediente acima. Se as p\u00e1ginas n\u00e3o t\u00eam a extens\u00e3o .shtml, \u00e9 prov\u00e1vel que os hackers n\u00e3o tentem alguma coisa, mesmo porque o SSI \u00e9 altamente \"hacke\u00e1vel\".<\/p>\n<p>Se voc\u00ea quiser usar SSI apenas nas p\u00e1ginas com extens\u00e3o .shtml mas quer, por exemplo, que todas as p\u00e1ginas index.html sejam SSI, basta adicionar a linha destacada em negrito:<\/p>\n<p>AddType text\/html .shtml<\/p>\n<p>AddHandler server-parsed .shtml<\/p>\n<p>Options Indexes Follow<\/p>\n<p>SymLinks Includes<\/p>\n<p>DirectoryIndex index.shtml index.html<\/p>\n<p>Isto faz com que p\u00e1ginas index.shtml sejam as primeiras a serem procuradas num diret\u00f3rio (as chamadas p\u00e1ginas default). Caso n\u00e3o seja encontrada uma p\u00e1gina com este nome, ent\u00e3o a segunda op\u00e7\u00e3o passa a ser index.html. Mais adiante veremos mais sobre o DirectoryIndex.<\/p>\n<p>Escondendo o .htaccess<\/p>\n<p>Se voc\u00ea usa o .htaccess para proteger \u00e1reas do site com senhas, a informa\u00e7\u00e3o da localiza\u00e7\u00e3o do arquivo de senhas pode ser facilmente obtida atrav\u00e9s do arquivo .htaccess. Se as permiss\u00f5es estiverem mal configuradas ou se o servidor n\u00e3o for dos mais seguros, um browser tem a possibilidade de mostrar o conte\u00fado do arquivo .htaccess atrav\u00e9s da interface padr\u00e3o. Neste caso, tanto o seu site, como o servidor, est\u00e3o comprometidos. Esta \u00e9 a parte ruim da hist\u00f3ria. A parte boa \u00e9 que \u00e9 poss\u00edvel impedir que o .htaccess possa ser visto:<\/p>\n<p>Order Allow,Deny<\/p>\n<p>Deny from all<\/p>\n<p>A primeira linha especifica que o arquivo chamado .htaccess possui uma regra. As regras ficam por conta da sua criatividade. Neste caso, a regra aplicada \u00e9 emitir uma ordem de permiss\u00e3o e recusa com Order Allow,Deny e depois indicar que a leitura est\u00e1 bloqueada para todo mundo com Deny for all. <\/p>\n<p>Com esta configura\u00e7\u00e3o, na maioria dos servidores, um usu\u00e1rio que tente ver este arquivo recebe um c\u00f3digo de erro 403. Tamb\u00e9m \u00e9 poss\u00edvel ajustar as permiss\u00f5es para o arquivo .htaccess atrav\u00e9s de um CHMOD para 644 ou RW-R--R--, uma medida de seguran\u00e7a adicional.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Arquivos .htaccess, tamb\u00e9m conhecidos como arquivos de configura\u00e7\u00e3o distribu\u00edda, oferecem meios para modificar as configura\u00e7\u00f5es de diret\u00f3rios. O .htaccess \u00e9<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,5],"tags":[],"class_list":["post-56","post","type-post","status-publish","format-standard","hentry","category-linux","category-web"],"_links":{"self":[{"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":1,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":117,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/posts\/56\/revisions\/117"}],"wp:attachment":[{"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcomapa.com\/artigos\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}