
Estou tentando implementar o HSTS (HTTP Strict Transport Security) em meu site Wordpress, mas não estou obtendo sucesso. Primeiro consegui redirecionar meu site de não www para www , incluindo https:// , mas recebi a mensagemhttps://hstspreload.org/que ele deve redirecionar para www primeiro.
Eu estava tentando usar o arquivo de configuração do VirtualHosts, sem sorte. Então eu pesquisei no Google e encontreiesse linkque parecia uma solução com htaccess, mas ainda estou tendo o problema. Se alguém souber como implementar isso através dos arquivos de configuração do VirtualHost/Apache, seria ótimo.
Erro: HTTP redireciona para www primeiro
http://inter.net
(HTTP) deve redirecionar imediatamente parahttps://inter.net
(HTTPS) antes de adicionar o subdomínio www. No momento, o primeiro redirecionamento é parahttps://www.inter.net/
. 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.
Meu htaccess está abaixo:
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
#### This is what I added : From https://www.danielmorell.com/guides/htaccess-seo/redirects/https-www-and-trailing-slash
#### Force HTTPS://WWW and remove trailing / from files ####
## Turn on rewrite engine
RewriteEngine on
# Remove trailing slash from non-filepath urls
RewriteCond %{REQUEST_URI} /(.+)/$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.inter.net/%1 [R=301,L]
# Include trailing slash on directory
RewriteCond %{REQUEST_URI} !(.+)/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+)$ https://www.inter.net/$1/ [R=301,L]
# Force HTTPS and WWW
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [OR,NC]
RewriteCond %{https} off
RewriteRule ^(.*)$ https://www.inter.net/$1 [R=301,L]
# Yoast SEO - XML Sitemap Rewrite Fix
RewriteEngine On
RewriteBase /
RewriteRule ^sitemap_index.xml$ /index.php?sitemap=1 [L]
RewriteRule ^locations.kml$ /index.php?sitemap=wpseo_local_kml [L]
RewriteRule ^geo_sitemap.xml$ /index.php?sitemap=geo [L]
RewriteRule ^([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 [L]
RewriteRule ^([a-z]+)?-?sitemap.xsl$ /index.php?yoast-sitemap-xsl=$1 [L]
# END Yoast SEO - XML Sitemap Rewrite Fix
ps - o URL inter.net é apenas um exemplo.
EDIT - editei meu arquivo example.com.conf para adicionar as regras extras fornecidas ao meu MrWhite na resposta abaixo - o que parece preciso. Depois de executar o comando apachectl configtest
Syntaw estava OK. Executei service apache2 reload
para que as alterações entrassem em vigor e fiz com que todos os navegadores informassem que a página não estava redirecionando corretamente: **ERR_TOO_MANY_REDIRECTS**
(limpei o cache a cada vez para cada navegador diferente).
Reverti o htaccess apenas para as regras originais do Wordpress e Yoast SEO.
Meu arquivo de configuração atual no Apache para este VirtualHost talvez tenha problemas, mas não há erro de sintaxe com apachectl configtest :https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK
Tentei usar o módulo Firefox Developer (F12) para ver se conseguia entender alguma informação adicional, o problema parece ser um loop de redirecionamento 301 parahttps://www.example.com
EDIT 2: Graças ao @MrWhite, entendi que o ServerAlias
detalhe era desnecessário e era a causa dos loops. Problema resolvido e aprendido com isso.
Responder1
Resumindo, os principais requisitos do HSTS são:
Redirecionar de HTTP para HTTPSno mesmo host. ou seja.
http://example.com
parahttps://example.com
ehttp://www.example.com
parahttps://www.example.com
Redirecionar para o nome de host canônico (www ou não www) somente em HTTPS. (ou seja, depois do nº 1 acima)
Envie o
Strict-Transport-Security
cabeçalho de resposta HTTP (STS) apenas quando estiver em HTTPS. Incluindo no redirecionamento canônico (nº 2 acima).(Embora várias fontes afirmem que o cabeçalho STS deveapenasser enviado por HTTPS e é totalmente inválido enviá-lo por HTTP simples, não acredito que seja o caso.A especificaçãoafirma que o UA deve simplesmente ignorar esse cabeçalho quando enviado por HTTP, portanto, não é um "problema" enviá-lo também por HTTP. No entanto, não é muito trabalhoso enviar isso apenas por HTTPS, e foi assim que implementei isso abaixo.)
O que significa, portanto, que você não pode necessariamente canonizar a solicitação (HTTP/HTTPS/www/não-www) em um único redirecionamento, pois isso pode violar o item 1 acima.
Você também não parece estar definindo o cabeçalho STS no código que postou. Se você estiver implementando o redirecionamento no Apache (configuração do servidor ou .htaccess
), não poderá definir esse cabeçalho usando o WordPress - se é isso que você está fazendo?
Pesquisei no Google e encontrei este link que parecia uma solução com htaccess
Essa “solução” não é implementar o HSTS. O único objetivo desse artigo é canonizar a solicitação em um único redirecionamento. O "aviso" no início do artigo indica explicitamente que ele viola o HSTS.
Você também colocou as diretivas na ordem errada. Estas directivas de "redirecionamento" precisam de iranteso controlador frontal do WordPress, caso contrário, ele simplesmente não será processado pelo WordPressvirtualURLs.
Presumo que seu nome de host canônico seja www.example.com
. (Embora você mencione um redirecionamento para não www no título da sua pergunta, você está redirecionando para www no restante da sua pergunta?)
Eu estava tentando usar o arquivo de configuração do VirtualHosts, sem sorte.
Embora seja indiscutivelmente mais simples e menos sujeito a erros e mais eficiente implementar isso na configuração do servidor (usando VirtualHosts separados).
Por exemplo (omitindo as "outras" diretivas necessárias):
<VirtualHost *:80>
ServerName example.com
# Redirect to HTTPS - same host
Redirect 301 / https://example.com/
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
# Redirect to HTTPS - same host
Redirect 301 / https://www.example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
# Redirect to canonical host (HTTPS only)
Redirect 301 / https://www.example.com/
# SSL directives...
# Set STS header on the HTTPS redirect ("always" argument is required for this)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
<VirtualHost *:443>
# Canonical host
ServerName www.example.com
# SSL directives...
# etc.
# Set STS header on the HTTPS response
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains"
</VirtualHost>
Observe que o cabeçalho STS acima define o max-age
parâmetro apenas para um período de 1 mês e não inclui o preload
parâmetro. Certifique-se de seguir as instruções fornecidas nos "requisitos de implantação" da lista de pré-carregamento do HSTS, se essa for a intenção.https://hstspreload.org/#deployment-recommendations
alternativamente, para implementar isso em.htaccess
(Observação: não implementei o redirecionamento "barra final", pois você não mencionou isso em seus requisitos e é simplesmente parte do código copiado do artigo externo.)
# Set HSTS env var only if HTTPS
RewriteCond %{HTTPS} on
RewriteRule ^ - [E=HSTS:1]
# Redirect HTTP to HTTPS on the same host
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Redirect non-www to www (HTTPS only)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Set HSTS header conditionally if request is over HTTPS only (based on HSTS env var)
Header always set Strict-Transport-Security "max-age=2592000; includeSubDomains" env=HSTS
# Yoast SEO - XML Sitemap Rewrite Fix
# : (directives go here...)
# END Yoast SEO - XML Sitemap Rewrite Fix
# BEGIN WordPress
# : (directives go here...)
# END WordPress
A always
condição é obrigatória na Header
diretiva para que o cabeçalho seja definido para respostas diferentes de 200 OK. ou seja. ele precisa ser definido no redirecionamento HTTPS 301 não www para www.
Veja tambémminha respostaà seguinte pergunta no CodeReview SE sobre a implementação de HSTS em .htaccess
: