Redirecionamento Apache de www para não-www e HTTP para HTTPS

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 ?

Talvez você goste de

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *