Redirecionamento via htaccess para leigos

Sempre que falamos de redirecionamento de sites, temos que tomar muito cuidado em como isso é feito, pois um erro pode prejudicar uma enorme queda em seu número de acessos se algo sair errado e a força do seu antigo site não for passada para o novo, por exemplo.

Existem muitos tipos de redirects, mas neste artiogo irei citar pra vocês somente os principais. Estou à disposição para ajudar quem precisar de código mais específicos, basta descrevê-lo nos comentários.

Entendendo um pouco mais sobre os redirects ou redirecionamentos via .htaccess

Os redirects no .htaccess são possíveis graças a um módulo do servidor web Apache chamado mod_rewrite, portanto esse módulo deve estar instalado no Apache para que ele funcione. As hospedagens compartilhados costumam habilitar por padrão o mod_rewrite para seus clientes, porém se você está montando seu server do zero pode precisar instalá-lo em seu manualmente (não entrarei na questão da instalação manual aqui por ser algo mais técnico que poderá deixar seu site fora do ar caso algo saia erado). Vamos então partir do pressuposto que seu web server já possui o mod_rewrite instalado.

Mas o que é o .htaccess?

O .htaccess nada mais é que um arquivo que fica na raiz do seu site (e pode também ser usado em pastas específicas), onde são setadas diversas configurações do mesmo, entre elas as que vamos falar neste artigo.

CURIOSIDADE: O “.” no início do arquivo htaccess significa que ele fica oculto no server e não é exibido ao digitarmos o comando “ls” no servidor linux (equivalente a o “dir” do finado DOS), evitando assim que pessoas mais leigas o editem e ferrem com seus sites (rs).

Os FLAGS do mod_rewrite:

Os flags são modificadoes das regras de rewrite (RewriteRule). Vêm sempre cercadas por colchetes [ ] e são inseridas semrpe no fim das regras. Flags múltiplas em uma mesma regra são separadas por vírgulas.

As flags que utilizaremos nesse artigo são:

  • [NC]:  significa no case-sensitive, ou seja, não diferencia maiúsculas e minúsculas (se algo for digitado em maiúscula, ele também entenderá);
  • [F]: Ou Forbidden, fazem o servidor retornar um erro 403 Forbidden;
  • [L]: Ou Last, significam que se aquela condição for válida as condições abaixo não serão processadas;
  • [R]: Ou Redirect, é responsável por direcionar o site para o URL especificado.

Para uma lista completa de FLAGS acesse aqui.

Símbolos do mod_rewrite utilizados no artigo:

  • ^(.*)$ significa quaisquer caracteres, portanto se vier seguido de http://www.seusite.com/$1 atribui tal valor de quaisquer caracteres ao $1 e então a regra se aplicará a qualquer que seja a url que venha após o domínio: Ex: www.seusite.com/qualquer-que-seja;
  • %{HTTP_HOST} significa a url digitada;
  • ^ significa início da string.

Como fazer os principais redirecionamentos via .htaccess?

Mãos a obra, irei listar e explicar cada um dos principais redirects que precisamos usar no dia-a-dia. [IMPORTANTE]: Sempre insira esses comandos no início de seu .htaccess, mesmo que ele já possua diversos códigos. E fique atento para verificar se já não existem comandos de rewrite que possam conflitar com seu novo código inserido. Plugins de redirect e de forçar ssl e as Page Rules do Cloudflare também podem conflitar com seu novo código. Portanto, vá com calma. 😉

Redirect de URL sem www para com www:

Neste primeiro exemplo vamos direcionar definitivamente o url seusite.com e todos seus subdiretórios para www.seusite.com.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^seusite.com [NC]
RewriteRule ^(.*)$ http://www.seusite.com/$1 [L,R=301]
</IfModule>

  • A primeira linha ativa o módulo.
  • A segunda liga o motor para que sejam aplicadas as regras.
  • A terceira impõe uma condição pra essa regra acontecer (no caso o site não ter www)
  • E por fim a quarta linha diz para direcionar para o www, com o código 301 (redirect permanente), poderíamos usar um 302 caso a intenção fosse um redirecionamento temporário.

Redirect de URL com www para sem www:

Basta fazer o inverso do comando acima. Substituindo na condição o seusite.com por www.seusite.com e na regra o http://www.seusite.com/$1 por http://seusite.com/$1. Ficará desta forma:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.seusite.com [NC]
RewriteRule ^(.*)$ http://seusite.com/$1 [L,R=301]
</IfModule>

Redirect de HTTP para HTTPS:

Este comando fará todas as requisições enviadas para http://seusite.com sejam automaticamente redirecionadas (301) para  https://seusite.com, lhe poupando de instalar um plugin pra tal função em seu site após a adição do certificado SSL, consecutivamente deixando seu site menos lento.

DICA 1: Sempre que sua hospedagem permitir o uso do protocolo http/2, ative-o, pois entre outras vantagens do protocolo ele irá acelerar o carregamento de seu site https.

DICA 2: Ao usar esse código, desative quaisquer plugins de redirect de http para https, pois os comandos podem conflitar gerando um ping-pong de redirects, retornando o erro: TOO_MANY_REDIRECTS.

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

Neste caso usei o header %{HTTP:X-Forwarded-Proto} que me diz se o protocolo é http ou https e na sequencia, na mesma linha verifico se o %{HTTP:X-Forwarded-Proto} é diferente de https (repare o ! antes do https, que singifica diferente de).

PERGUNTA: Eu não poderia usar o RewriteCond %{HTTPS} off ou ainda RewriteCond %{SERVER_PORT} 80  ao invés do RewriteCond %{HTTP:X-Forwarded-Proto} !http ?

RESPOSTA: Sim, poderia, porém isso tornaria meu código incompatível com o Google HTTP Load Balancer do Google Cloud,  então recomendo SEMPRE usarem esse código no redirect entre protocolos http e https.

Redirect de HTTPS para HTTP:

Se por algum motivo precisar fazer o inverso e redirecionar de https para http:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !http
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [L,R=301]
</IfModule>

Redirecionamento de subdomínio para domínio:

Caso sua necessidade seja direcionar um antigo subdomínio para um domínio, basta fazer dessa forma, inserindo na regra (RewriteRule) o www quando existir ou omitindo-o quando não existir. Lembrando que sempre o 301 pode ser substituído por 302, quando for um redirecionamento temporário.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^subdominio.seusite.com [NC]
RewriteRule ^(.*)$ http://seusite.com/$1 [L,R=301]
</IfModule>

Redirecionamento de domínio para subdomínio:

Basta fazermos o oposto do comando acima, não tem segredo:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^seusite.com [NC]
RewriteRule ^(.*)$ http://subdominio.seusite.com/$1 [L,R=301]
</IfModule>

Redirecionamento de um domínio para outro:

É importante fazer esse redirect quando você vai mudar a url de seu site, pois assim você consegue passar a força que seu site adquiriu ao longo do tempo para a nova url.

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^seusite1.com [NC]
RewriteRule ^(.*)$ http://seusite2.com/$1 [L,R=301]
</IfModule>

Redirecionamento de um subdiretório para a raiz do domínio:

Deseja que um subdiretório de seu site seja redirecionado para a raiz do domínio (ex: de http://seusite.com/subdir para http://seusite.com/)

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^subdir/(.*)$ http://seusite.com/ [R=301,L]
</IfModule>

Redirecionamento via arquivos PHP:

<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://laluzdigital.com/");
exit();
?>

Como checar se meu redirecionamento realmente funcionou?

Se você utiliza Mac ou Linux com o curl instalado, basta na linha de comando do terminal digitar: curl -I seusite.com  (onde o I é um i maiúsculo e não um L minúsculo e o seusite.com pode ser substituído pela URL completa). Ou se preferir utilize nossa ferramenta gratuita de verificação de Status HTTP.

 

Espero que tenha gostado deste artigo. Deixe seu comentário com sugestões, críticas e, preferecialmente, elogios (rs). Até o próximo post.

29 comentários em “Redirecionamento via htaccess para leigos”

  1. Eu reinstalei o meu wordpress que estava na pasta /soul para o ..root, e queria com todo o conteudo listado nos sites de busca (que agora da 404) fossem direcionados para o mesmo link mas sem o /soul/…

    Tentei o exemplo citado para ‘subdiretorio para a raiz’, mas não está funcionando. Pode me ajudar?

    Responder
  2. Ótimo conteúdo, obrigado por compartilhar! 🙂

    Tenho uma dúvida que não consigo achar resposta para ela.
    Eu fiz o redirecionamento correto do meu site para remover o WWW da url, porém, em algumas URLs antigas, exemplo, http://www.meusite.com.br/endereco_de_uma_pagina_qualquer, quando clicada ao invés de somente remover o www, ele remove o www e joga o usuário para a raiz do site, tipo assim https://meusite.com.br/index.php.

    Não consegui encontrar como resolver isso. :/

    Responder
  3. Como faço para rediricionar apenas uma url de um dominio x para apenas outra url de outro dominio y – lembrando que não é o site inteiro , é apenas uma pagina que será redirecionado .

    Responder
  4. Olá. Preciso de uma dica. Eu fiz um redirecionamento de http para https. Funcionou blz. Agora eu preciso fazer um para quando o visitante estiver em um dispositivo movel ser levado para outra página. Quero fazer isso no .htaccess contudo se eu colo lá junto com o redirecionamento do https o sistema me retorna um erro ao acessar no dispositivo movel informando que fui redirecionado varias vezes. Tem como colocar um redirecionamento condicional como é o caso de dispositivos moveis mas sem tirar o do https?

    Grato

    Responder
    • Desculpe a demora, não havia visto sua mensagem. Ainda está com esse problema? Se sim, me informe que lhe ajudo, ok?

      Responder
  5. Opa, tem como eu indicar no htacces para que o link http://www.meusite.com.br (raiz) use permanentemente o subdiretório /subdir para que os usuários digitem o link raíz e naveguem no /subdir de forma transparente (inclusive não precisa mostrar no link onde está, pode ficar oculto no raíz. ?

    Obrigado

    Responder
  6. Como faço para redirecionar sem alterar a url? Ou seja, se a pessoa entrar pelo .com vai ver o endereço .com, e se entrou com .com.br vai ver o endereço .com.br, mas ambos sendo o mesmo conteúdo.

    já vi algumas respostas indicando para colocar [P] no final da linha RewriteRule, mas quando faço isso dá erro.

    Obrigado

    Responder
    • Desculpe a demora na resposta, mas primeiramente preciso entender o intuito disso, pois se você tiver duas páginas idênticas com urls diferentes pode ser prejudicado se não for corretamente configurado.

      Responder
  7. Olá,
    Gostaria de redirecionar apenas um diretório (com todas suas pastas e arquivos) de um domínio para outro domínio, no qual será também apenas mais um diretório.

    A partir do texto, imaginei que seria assim:

    RewriteEngine on
    RewriteBase /
    RewriteRule ^subdir/(.*)$ http://novosite.com/meudiretorio [R=301,L]

    Esta certo?
    Grato pela ajuda!!

    Responder
    • Nesse caso use:

      RewriteEngine on
      RewriteBase /
      RewriteRule ^/meucliente/(.*)$ /loja/meucliente/ [R=301,L]

      Diga se funcionou. 😉

      Responder

Deixe um comentário

Cadastre-se

Cadastre-se para receber nossas novidades e matérias.