Eu gerencio um pequeno site em um ambiente LAMP de hospedagem compartilhada: isso basicamente significa que a única coisa que posso editar é um arquivo htaccess.
Eu queria adicionar suporte HSTS (e consegui), mas, quandoTestei meu site aquipara elegibilidade de pré-carregamento HSTS, recebi o seguinte erro:
Erro: HTTP redireciona para www primeiro
http://example
(HTTP) deve redirecionar imediatamente parahttps://example
(HTTPS) antes de adicionar o subdomínio www. No momento, o primeiro redirecionamento é parahttps://www.example.
O redirecionamento extra é necessário para garantir que qualquer navegador que suporte HSTS registre a entrada HSTS para o domínio de nível superior, não apenas para o subdomínio.
Então, suponho que devo redirecionar os usuários desta forma:
http://example
(isto é o que o usuário insere na barra de endereço do seu navegador)https://example
(redirecionamos ele para a versão HTTPS do site)https://www.example
(nós o redirecionamos novamente para o subdomínio www)
Meu redirecionamento atual é feito desta forma:
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Tentei adicionar um redirecionamento antes da última linha, desta forma:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
mas recebi um erro "a página não está redirecionando corretamente" do navegador.
Então, qual é a maneira correta de redirecionar um usuário da versão http do site para https e finalmente para https com www? E: há riscos?
Responder1
Como observado noRequisitos de envio da lista de pré-carregamento HSTS:
- Redirecione de HTTP para HTTPS no mesmo host, se você estiver escutando na porta 80.
Você precisa redirecionar para omesmo anfitrião(ou seja, HTTP_HOST
), não simplesmente para example.com
primeiro. Você não precisa redirecionar para example.com
se o usuário estiver solicitando www.example.com
diretamente. (O teste envolverá uma solicitação para example.com
.) Depois disso, você poderá redirecionar para o subdomínio www canônico, se necessário.
Tentei adicionar um redirecionamento antes da última linha, desta forma:
RewriteRule ^(.*)$ https://example.com/$1 [R,L]
Isso criaria um loop de redirecionamento, porque a RewriteCond
diretiva anterior se aplica apenas ao primeiro RewriteRule
, portanto o segundo RewriteRule
seria executado incondicionalmente.
Tente algo como o seguinte:
# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]
# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]
A HTTP_HOST
variável server contém o valor do Host
cabeçalho da solicitação HTTP (ou seja, qualquer host que esteja sendo solicitado).
O segundo redirecionamento indica... para todas as solicitações em que o host solicitado não inicia e www.
então prefixa www.
o host. No entanto, isso pode não ser aceitável se você tiver vários subdomínios (que resolvem para o mesmo local) que deseja manter separados, pois eles serão naturalmente redirecionados para o subdomínio www.
Observe que esses são redirecionamentos 302 (temporários). Mude para 301 somente quando tiver certeza de que está funcionando bem.
E: há riscos?
Sem riscos. Sim, existem potencialmente dois redirecionamentos, ao passo que anteriormente poderia ter havido apenas um (o que é indiscutivelmente menos eficiente). Mas ainda existem apenas dois redirecionamentos, o que é perfeitamente adequado para SEO. Além disso, com o HSTS, o user-agent só experimentará o redirecionamento duplo no máximo uma vez.
RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]
Aparte:(Ignorando HSTS por enquanto...) Isso não estaria completo por si só, pois não canoniza uma solicitação para https://example.com/...
(ou seja, HTTPS e ápice de domínio).
Leitura adicional:
- Minha resposta a uma pergunta relacionada no Pro Webmasters SE que fornece mais detalhes sobre a implementação de HSTS em
.htaccess
:https://webmasters.stackexchange.com/a/112264/52912