HSTS e redirecionamento duplo

HSTS e redirecionamento duplo

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 para https://example(HTTPS) antes de adicionar o subdomínio www. No momento, o primeiro redirecionamento é para https://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:

  1. http://example(isto é o que o usuário insere na barra de endereço do seu navegador)
  2. https://example(redirecionamos ele para a versão HTTPS do site)
  3. 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:

  1. 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.comprimeiro. Você não precisa redirecionar para example.comse o usuário estiver solicitando www.example.comdiretamente. (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 RewriteConddiretiva anterior se aplica apenas ao primeiro RewriteRule, portanto o segundo RewriteRuleseria 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_HOSTvariável server contém o valor do Hostcabeç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:

informação relacionada