Redirecionamento de HSTS e Wordpress para www e não www e https - evita redirecionamentos múltiplos?

Redirecionamento de HSTS e Wordpress para www e não www e https - evita redirecionamentos múltiplos?

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 para https://inter.net(HTTPS) antes de adicionar o subdomínio www. No momento, o primeiro redirecionamento é para https://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 configtestSyntaw estava OK. Executei service apache2 reloadpara 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 ServerAliasdetalhe era desnecessário e era a causa dos loops. Problema resolvido e aprendido com isso.

Responder1

Resumindo, os principais requisitos do HSTS são:

  1. Redirecionar de HTTP para HTTPSno mesmo host. ou seja. http://example.comparahttps://example.com e http://www.example.comparahttps://www.example.com

  2. Redirecionar para o nome de host canônico (www ou não www) somente em HTTPS. (ou seja, depois do nº 1 acima)

  3. Envie o Strict-Transport-Securitycabeç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-ageparâmetro apenas para um período de 1 mês e não inclui o preloadparâ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 alwayscondição é obrigatória na Headerdiretiva 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:

informação relacionada