HSTS e redirecionamento duplo

8

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 a HSTS (e eu fiz isso), mas, quando eu testei meu site aqui para qualificação de pré-carregamento de HSTS, recebi o seguinte erro:

Error: HTTP redirects to www first

http://example (HTTP) should immediately redirect to https://example (HTTPS) before adding the www subdomain. Right now, the first redirect is to https://www.example. The extra redirect is required to ensure that any browser which supports HSTS will record the HSTS entry for the top level domain, not just the subdomain.

Então, suponho que eu deveria redirecionar os usuários dessa maneira:

  1. http://example (é isso que o usuário digita na barra de endereços do seu navegador)
  2. https://example (nós o redirecionamos 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 assim:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Eu tentei adicionar um redirecionamento antes da última linha, desta forma:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

mas recebi um erro "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 o https e, finalmente, para o https com www? E: há algum risco?

    
por Ian Bell 11.09.2018 / 09:19

1 resposta

8

Conforme observado nos requisitos de envio da lista de pré-carregamento de HSTS :

  1. Redirect from HTTP to HTTPS on the same host, if you are listening on port 80.

Você precisa redirecionar para o mesmo host (ou seja, HTTP_HOST ), não apenas 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ê pode redirecionar para o subdomínio canônico www, se necessário.

I tried to add a redirect before the last line, this way:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Isso criaria um loop de redirecionamento, porque a diretiva RewriteCond anterior aplica-se apenas ao primeiro RewriteRule , então 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 variável do servidor HTTP_HOST contém o valor do cabeçalho da solicitação Host 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 www. , em seguida, o prefixo www. para 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 OK.

And: are there any risks?

Sem riscos. Sim, existem potencialmente dois redirecionamentos, enquanto anteriormente só poderia haver um (que é possivelmente menos eficiente). Mas ainda existem apenas dois redirecionamentos, o que é perfeitamente aceitável 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]

Além de: (Ignorando HSTS no momento ...) Isso não seria completo por si só, já que não canoniza uma solicitação para https://example.com/... (ou seja, HTTPS e domínio ápice).

Outras leituras:

  • Minha resposta a uma pergunta relacionada no Pro Webmasters SE que fornece mais detalhes sobre a implementação do HSTS em .htaccess : link
por 11.09.2018 / 09:46