Quer saber como redirecionar um site de www para não-www de modo correto?
A crescente adoção de HTTPS como o protocolo de conexão padrão para sites introduziu alguns novos desafios para desenvolvedores e administradores de sistemas, como a necessidade de consolidar um domínio canônico redirecionando sites não-HTTP para HTTPS, além de redirecionar www para não-www (ou vice-versa).
Introdução
Neste post eu mostro como redirecionar um site de www para não-www (ou vice-versa) e de HTTP para HTTPS, usando a configuração do servidor Apache.
Para ser mais claro, a configuração redirecionará os seguintes nomes de host:
http://exemplo.com.br
http://www.exemplo.com.br
https://www.exemplo.com.br
para:
https://exemplo.com.br
Eu também mostrarei uma pequena alteração para redirecionar a versão não-www para a versão www, se você preferir usar o www.
Configuração do Apache
Para configurar os redirecionamentos, adicione a seguinte regra de redirecionamento ao arquivo de configuração do Apache (se você tiver acesso a ele), ou ao .htaccess na raiz do seu site:
RewriteEngine On RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]
Se, em vez de exemplo.com.br, você quiser que o URL padrão seja www.exemplo.com.br, basta alterar a terceira e a quinta linhas:
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
Como funciona
Como não sou muito fã de tutoriais do tipo recortar e colar, vamos tentar entender como a configuração funciona. Isso ajudará você a fazer modificações, se necessário.
RewriteEngine On
A primeira linha habilita o mecanismo de reescrita em tempo de execução do Apache, necessário para executar o redirecionamento.
Você já pode ter ativado esta opção em uma configuração anterior no mesmo arquivo. Se for esse o caso, você pode pular a linha acima.
RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC]
Essas duas linhas são as condições de redirecionamento.
Elas são usadas para determinar se a solicitação deve ser redirecionada. Como as condições são associadas a um [OR], se alguma dessas duas condições retornar “true”, o Apache executará a regra de reconfiguração (o redirecionamento).
A primeira condição determina se a solicitação está usando uma URL não-HTTPS.
A segunda condição determina se a solicitação está usando a URL www. Observe que usei www\. e não www., porque o padrão é uma expressão regular e o ponto “.” tem um significado especial aqui. Portanto, deve ser ignorado.
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
A quarta linha é uma linha conveniente que usei para evitar referenciar o nome do host diretamente na URL.
Ele corresponde ao HOST da solicitação recebida e a decompõe na parte www (se houver) e o resto do nome do host. Vamos referenciar isso depois com %1 no RewriteRule.
Se você souber o nome do host antecipadamente, poderá melhorar a regra, incluindo a URL e ignorando essa condição (veja mais adiante).
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]
O RewriteRule é o coração do redirecionamento. Com essa linha, informamos ao Apache para redirecionar qualquer solicitação para uma nova URL, composta por:
- https://www.
- %1: a referência à parte não-www do host
- %{REQUEST_URI}: o URI da solicitação, sem o nome do host
Todos esses tokens são unidos e representam o URI de redirecionamento final.
Finalmente, nós adicionamos 3 flags:
- NE para não escapar os caracteres especiais
- R=301 para usar o status de redirecionamento HTTP 301
- L para parar de processar outras regras e redirecionar imediatamente
Observações
Como já mencionei, meu exemplo usa uma linha RewriteCond extra para extrair o nome do host e evitar o nome do host na regra inline.
Se você acha que isso ocasionará uma penalidade de desempenho para você, então você pode inserir o host diretamente na regra:
RewriteEngine On RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\. [NC] RewriteRule ^ https://exemplo.com.br%{REQUEST_URI} [L,NE,R=301]
Outra solução
Você também pode acrescentar essas linhas ao seu arquivo htaccess:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] #Redirect HTTP with www to HTTPS without www RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC] RewriteRule .* https://%1%{REQUEST_URI} [R=301,L] #Redirect HTTP without www to HTTPS without www RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www. [NC] RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] #Redirect HTTPS with www to HTTPS without www RewriteCond %{HTTPS} on RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC] RewriteRule .* https://%1%{REQUEST_URI} [R=301,L] </IfModule>
Conclusão
Este post fornece uma configuração simples para redirecionar solicitações www e não-HTTPS para o domínio canônico do site.
Isso é muito útil para evitar problemas de duplicação de conteúdo com os mecanismos de busca e oferecer uma experiência aprimorada aos usuários.
Se você pesquisar on-line, existem dezenas de maneiras de realizar um redirecionamento no Apache, essa é apenas uma das possibilidades e pode não abranger todos os possíveis casos.
Então, espero que, com a explicação apresentada acima na seção “Como funciona”, você possa personalizar de acordo com suas necessidades.
Quer saber como implementar SSL e HTTPS no WordPress ?