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.
Índice
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.
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 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.
Para uma lista completa de FLAGS acesse aqui.
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. 😉
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>
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>
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.
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>
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>
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>
É 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>
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>
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: https://laluzdigital.com/");
exit();
?>
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.
25 Comments
Conteúdo top
Conteúdo de ótima qualidade!
Quem sabe, sabe! Ja dizia a antiga prologica! Conteudo de primeira, obrigado por compartilhar.
conteúdo de primeira não se ver por ai.
Show!
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?
Tente dessa forma:
RedirectMatch 301 ^/seu-subdir/$ http://seudominio.com/
Utilizando somente essa linha mesmo.
Não deu certo não… Tentei de várias formas, inclusive só a linha sugerida, sem mais absolutamente nada. Dá 404
RedirectMatch 301 ^/soul/$ http://showit.art.br/
Claudio, aonde está hospedado? Seu webserver é Apache ou Nginx?
RewriteEngine on
RewriteCond %{HTTP_HOST} ^tihost.online [NC]
RewriteRule ^(.*)$ https://tihost.site123.me/$1 [L,R=301]
seria isto ?
Correto!
Ó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, 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. :/
Faça o redirect dessa forma e dará tudo certo:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.meusite\.com.br$ [NC]
RewriteRule ^ http://meusite.com.br%{REQUEST_URI} [R=301,L]
Me diga se deu td certo.
Excelente conteúdo, me ajudou muito. Valeu Marcelo…..
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 .
Desculpe a demora, sua msg passou batida. Segue:
RewriteRule ^urlantiga.html$ http://novodominio.com/novaurl.html [R=301]
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
Desculpe a demora, não havia visto sua mensagem. Ainda está com esse problema? Se sim, me informe que lhe ajudo, ok?
Opa, tem como eu indicar no htacces para que o link 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
Desculpe a demora na resposta. Havia passado batido por sua pergunta. Use no .htaccess:
RedirectMatch 301 ^/subdir/$ http://www.meusite.com.br/
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
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.
Favoritoado! muito bem explicado. obrigado
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!!
Utilize:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/diretorioatual/(.*)$
RewriteRule ^(.*) http://www.novodominio.com.br/novodiretorio/%1 [R=301,NC]
Abs e desculpe a demora. Só vi agora sua msg.