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.