
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 ahttps://inter.net
(HTTPS) antes de agregar el subdominio www. En este momento, la primera redirección es ahttps://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 configtest
Syntaw estaba bien. Se ejecutó service apache2 reload
para 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 ServerAlias
detalle era innecesario y era la causa de los bucles. Problema resuelto y aprendido de eso.
Respuesta1
En resumen, los principales requisitos de HSTS son:
Redirigir de HTTP a HTTPSen el mismo anfitrión. es decir.
http://example.com
ahttps://example.com
yhttp://www.example.com
ahttps://www.example.com
Redirija al nombre de host canónico (www o no www) solo en HTTPS. (es decir, después del punto 1 anterior)
Envíe el
Strict-Transport-Security
encabezado 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-age
parámetro por un período de 1 mes y no incluye el preload
pará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 always
condición es obligatoria en la Header
directiva, 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
: