Redirección de HSTS y Wordpress a www y no www y https: ¿evitar múltiples redirecciones?

Redirección de HSTS y Wordpress a www y no www y https: ¿evitar múltiples redirecciones?

Estoy intentando implementar HSTS (HTTP Strict Transport Security) en mi sitio de Wordpress, pero no obtengo ningún éxito. Primero logré redirigir mi sitio de no www a www, incluyendo https://, pero recibí el mensajehttps://hstspreload.org/que debería redirigir primero a www.

Estaba intentando utilizar el archivo de configuración VirtualHosts, pero no tuve suerte. Así que busqué en Google y encontréeste enlaceque parecía una solución con htaccess, pero sigo teniendo el problema. Si alguien sabe cómo implementar esto a través de los archivos de configuración de VirtualHost/Apache, sería genial.

Error: HTTP redirige a www primero http://inter.net(HTTP) debería redirigir inmediatamente a https://inter.net(HTTPS) antes de agregar el subdominio www. En este momento, la primera redirección es a https://www.inter.net/. La redirección adicional es necesaria para garantizar que cualquier navegador que admita HSTS registre la entrada HSTS para el dominio de nivel superior, no solo el subdominio.

Mi htaccess está a continuación:

# 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

PD: la URL de Internet es solo un ejemplo.

EDITAR: he editado mi archivo example.com.conf para agregar las reglas adicionales dadas por mi MrWhite en la respuesta a continuación, que parece precisa. Después de ejecutar el comando apachectl configtestSyntaw estaba bien. Se ejecutó service apache2 reloadpara que los cambios surtieran efecto y todos los navegadores dijeron que la página no se redirige correctamente **ERR_TOO_MANY_REDIRECTS**(se borró el caché cada vez para cada navegador diferente).

Revertí el htaccess a las reglas originales de Wordpress y Yoast SEO únicamente.

Mi archivo de configuración actual en Apache para este VirtualHost tal vez tenga problemas, pero no hay ningún error de sintaxis con apachectl configtest:https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK

Intenté usar el módulo Firefox Developer (F12) para ver si podía entender alguna información adicional, el problema parece ser un bucle de redireccionamiento 301 ahttps://www.example.com

EDITAR 2: Gracias a @MrWhite, entendí que el ServerAliasdetalle era innecesario y era la causa de los bucles. Problema resuelto y aprendido de eso.

Respuesta1

En resumen, los principales requisitos de HSTS son:

  1. Redirigir de HTTP a HTTPSen el mismo anfitrión. es decir. http://example.comahttps://example.com y http://www.example.comahttps://www.example.com

  2. Redirija al nombre de host canónico (www o no www) solo en HTTPS. (es decir, después del punto 1 anterior)

  3. Envíe el Strict-Transport-Securityencabezado de respuesta HTTP (STS) solo cuando esté en HTTPS. Incluyendo la redirección canónica (n.° 2 arriba).

    (Aunque varias fuentes afirman que el encabezado STS debesoloenviarse a través de HTTPS e incluso es totalmente inválido enviarlo a través de HTTP simple, no creo que este sea el caso.la especificaciónestablece que la UA simplemente debe ignorar este encabezado cuando se envía a través de HTTP, por lo que no es un "problema" enviarlo también a través de HTTP. Sin embargo, no es mucho trabajo enviar esto solo a través de HTTPS, que es como lo implementé a continuación).

Por lo tanto, lo que significa que no necesariamente puede canonicalizar la solicitud (HTTP/HTTPS/www/no www) en una única redirección, ya que esto podría violar el punto 1 anterior.

Tampoco parece que estés configurando el encabezado STS en el código que has publicado. Si está implementando la redirección en Apache (configuración del servidor o .htaccess), entonces no puede configurar este encabezado usando WordPress, ¿si eso es lo que está haciendo?

Busqué en Google y encontré este enlace que parecía una solución con htaccess

Esa "solución" no es implementar HSTS. El único objetivo de dicho artículo es canonicalizar la solicitud en una única redirección. La "advertencia" en la parte superior de ese artículo le dice explícitamente que viola HSTS.

También has puesto las directivas en el orden incorrecto. Estas directivas de "redireccionamiento" deben desaparecerantesel controlador frontal de WordPress; de lo contrario, simplemente no se procesará para WordPressvirtualURL.

Supongo que su nombre de host canónico es www.example.com. (Aunque menciona una redirección a no www en el título de su pregunta, ¿está redirigiendo a www en el resto de su pregunta?)

Estaba intentando utilizar el archivo de configuración VirtualHosts, pero no tuve suerte.

Aunque podría decirse que es más simple y menos propenso a errores y más eficiente implementar esto en la configuración del servidor (usando VirtualHosts separados).

Por ejemplo (omitiendo las "otras" directivas necesarias):

<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>

Tenga en cuenta que el encabezado STS anterior solo establece el max-ageparámetro por un período de 1 mes y no incluye el preloadparámetro. Asegúrese de seguir las instrucciones proporcionadas en los "requisitos de implementación" de la lista de precarga de HSTS, si esa es la intención.https://hstspreload.org/#deployment-recommendations

Alternativamente, para implementar esto en.htaccess

(NB: no he implementado la redirección de "barra diagonal", ya que no mencionaste esto en tus requisitos y es simplemente parte del código copiado del artículo 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

La alwayscondición es obligatoria en la Headerdirectiva, por lo que el encabezado se establece en respuestas que no sean 200 OK. es decir. debe configurarse en la redirección HTTPS 301 que no sea www a www.

Ver tambiénmi respuestaa la siguiente pregunta sobre CodeReview SE sobre la implementación de HSTS en .htaccess:

información relacionada