HSTS e redirecionamento duplo

9

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 ao HSTS (e fiz), mas quando testei meu site aqui para elegibilidade ao pré-carregamento do HSTS, recebi o seguinte erro:

Erro: o HTTP redireciona para www primeiro

http://example(HTTP) deve ser redirecionado 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 maneira:

  1. http://example (é isso que o usuário digita na barra de endereço do 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 desta maneira:

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

Tentei adicionar um redirecionamento antes da última linha, desta maneira:

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

mas recebi o erro "a página não está redirecionando corretamente" no 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: existem riscos?

HBruijn
fonte

Respostas:

10

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

  1. Redirecione de HTTP para HTTPS no mesmo host, se você estiver ouvindo na porta 80.

Você precisa redirecionar para o mesmo host (ie. HTTP_HOST), Não apenas para o 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 maneira:

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

Isso criaria um loop de redirecionamento, porque a RewriteConddiretiva anterior se aplica apenas à primeira RewriteRule, portanto a segunda RewriteRuleseria executada 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 do servidor 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 www.e o prefixo www.para o host. No entanto, isso pode não ser aceitável se você tiver vários subdomínios (resolvidos 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 apenas quando tiver certeza de que está funcionando bem.

E: existem riscos?

Sem riscos. Sim, há potencialmente dois redirecionamentos, enquanto anteriormente poderia haver apenas um (o que é sem dúvida menos eficiente). Mas ainda existem apenas dois redirecionamentos, o que é perfeitamente aceitável para SEO. Além disso, com o HSTS, o agente do usuário só experimentará o redirecionamento duplo no máximo uma vez.


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

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


Leitura adicional:

Sr. White
fonte
Muito obrigado, testarei em breve. Uma resposta rápida à parte final: isso funciona de qualquer maneira, mas parece que é algo que não posso controlar diretamente (não no arquivo htaccess, pelo menos: há um painel de redirecionamento no gerenciador de sites do provedor de hospedagem)
1
Btw, sua solução funciona perfeitamente! :-)
1
"painel de redirecionamento no gerenciador de sites do provedor de hospedagem" - eu sempre desconfio de tais ferramentas. Por exemplo, a seção de redirecionamentos no cPanel é muito limitada e notória.
precisa saber é o seguinte
1
Isso depende de como você está configurando o Strict-Transport-Securitycabeçalho de resposta. Por exemplo, para definir isso no redirecionamento, você precisará usar o alwaysargumento na Headerdiretiva. Respondi a uma pergunta relacionada na pilha do Pro Webmasters (pule a primeira parte da minha resposta sobre on/ off), que entra em mais detalhes sobre a implementação do " pré-carregamento HSTS " no .htaccess.
precisa saber é o seguinte
1
De nada. Para ser sincero, a pilha de Pro Webmasters provavelmente é mais adequada .htaccessapenas para questões relacionadas (ServerFault supõe que você tenha controle total do servidor; nesse caso, você não faria isso .htaccess). É discutivelmente mais fácil implementar isso na configuração do servidor usando <VirtualHost>contêineres separados (já que você não precisa mexer com env vars e condições adicionais - é "mais limpo" e menos propenso a erros). Acho que não recomendaria o envio da "lista de pré-carregamento" se você tiver apenas acesso .htaccess. (My 2c)
MrWhite