
Ich versuche, HSTS (HTTP Strict Transport Security) auf meiner Wordpress-Site zu implementieren, aber ich habe keinen Erfolg. Zuerst hatte ich es geschafft, meine Site von nicht-www auf www umzuleiten und https:// einzubinden, aber ich bekam die Meldunghttps://hstspreload.org/dass zuerst auf www umgeleitet werden soll.
Ich habe versucht, die Konfigurationsdatei von VirtualHosts zu verwenden, aber ohne Erfolg. Also habe ich ein bisschen gegoogelt und gefundendieser Linkdas sah nach einer Lösung mit htaccess aus, aber ich habe immer noch das Problem. Wenn jemand weiß, wie man das über die VirtualHost-/Apache-Konfigurationsdateien implementiert, wäre das wirklich großartig.
Fehler: HTTP leitet zuerst auf www weiter
http://inter.net
(HTTP) sollte sofort zuhttps://inter.net
(HTTPS) umleiten, bevor die www-Subdomäne hinzugefügt wird. Derzeit erfolgt die erste Umleitung zuhttps://www.inter.net/
. Die zusätzliche Umleitung ist erforderlich, um sicherzustellen, dass jeder Browser, der HSTS unterstützt, den HSTS-Eintrag für die Top-Level-Domäne und nicht nur für die Subdomäne aufzeichnet.
Mein htaccess ist unten:
# 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: Die Inter.net-URL dient nur als Beispiel.
BEARBEITEN – Ich habe meine Datei example.com.conf bearbeitet, um die zusätzlichen Regeln hinzuzufügen, die mir MrWhite in der Antwort unten gegeben hat – die richtig aussieht. Nach dem Ausführen des Befehls apachectl configtest
war Syntaw in Ordnung. Ich habe es ausgeführt, service apache2 reload
damit die Änderungen wirksam werden, und alle Browser haben mir gemeldet, dass die Seite nicht richtig umgeleitet wird: **ERR_TOO_MANY_REDIRECTS**
(Cache jedes Mal für jeden einzelnen Browser geleert).
Ich habe den htaccess nur auf die ursprünglichen Wordpress- und Yoast-SEO-Regeln zurückgesetzt.
Meine aktuelle Konfigurationsdatei auf Apache für diesen VirtualHost hat möglicherweise Probleme, aber es gibt keinen Syntaxfehler mit apachectl configtest:https://paste.ofcode.org/vr25hFkPEt2vYjpM5sAUxK
Ich habe versucht, das Firefox-Entwicklermodul (F12) zu verwenden, um zu sehen, ob ich zusätzliche Informationen verstehen konnte. Das Problem scheint eine 301-Umleitungsschleife zu seinhttps://www.example.com
EDIT 2: Dank @MrWhite habe ich verstanden, dass das ServerAlias
Detail unnötig war und die Ursache für die Schleifen war. Problem gelöst und daraus gelernt.
Antwort1
Zusammenfassend sind die Hauptanforderungen von HSTS:
Umleitung von HTTP auf HTTPSauf demselben Host. d. h.
http://example.com
zuhttps://example.com
Undhttp://www.example.com
Zuhttps://www.example.com
Weiterleitung zum kanonischen Hostnamen (www oder nicht-www) nur über HTTPS. (also nach Nr. 1 oben)
Senden Sie den
Strict-Transport-Security
(STS) HTTP-Antwortheader nur bei HTTPS. Einschließlich der kanonischen Umleitung (Nr. 2 oben).(Obwohl mehrere Quellen angeben, dass der STS-Headernurüber HTTPS gesendet werden und es ist sogar völlig ungültig, es über einfaches HTTP zu senden. Ich glaube nicht, dass dies der Fall ist.Die Spezifikationbesagt, dass die UA diesen Header einfach ignorieren soll, wenn er über HTTP gesendet wird, sodass es kein „Problem“ ist, ihn auch über HTTP zu senden. Es ist jedoch kein großer Aufwand, ihn nur über HTTPS zu senden, und so habe ich es unten implementiert.)
Dies bedeutet, dass Sie die Anforderung (HTTP / HTTPS / www / nicht-www) nicht unbedingt in einer einzigen Umleitung kanonisieren können, da dies gegen Nr. 1 oben verstoßen könnte.
Sie scheinen den STS-Header in dem von Ihnen geposteten Code auch nicht festzulegen. Wenn Sie die Weiterleitung in Apache implementieren (Serverkonfiguration oder .htaccess
), können Sie diesen Header nicht mit WordPress festlegen – wenn Sie das tun?
Ich habe ein bisschen gegoogelt und diesen Link gefunden, der wie eine Lösung mit htaccess aussah
Diese „Lösung“ implementiert kein HSTS. Der einzige Zweck dieses Artikels besteht darin, die Anfrage in einer einzigen Umleitung zu kanonisieren. Die „Warnung“ oben in diesem Artikel weist Sie ausdrücklich darauf hin, dass dies gegen HSTS verstößt.
Sie haben die Anweisungen auch in der falschen Reihenfolge gesetzt. Diese „Redirect“-Anweisungen müssen wegVorder WordPress-Front-Controller, sonst wird es einfach nicht für WordPress verarbeitetvirtuellURLs.
Ich nehme an, Ihr kanonischer Hostname ist www.example.com
. (Obwohl Sie im Titel Ihrer Frage eine Weiterleitung zu einem anderen Server als www erwähnen, leiten Sie im Rest Ihrer Frage auf www um?)
Ich habe versucht, die VirtualHosts-Konfigurationsdatei zu verwenden, ohne Erfolg.
Obwohl es wohl einfacher, weniger fehleranfällig und effizienter ist, dies in der Serverkonfiguration zu implementieren (unter Verwendung separater virtueller Hosts).
Zum Beispiel (unter Weglassung der „anderen“ notwendigen Anweisungen):
<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>
Beachten Sie, dass der STS-Header oben den max-age
Parameter nur für einen Zeitraum von 1 Monat festlegt und den Parameter nicht einschließt preload
. Befolgen Sie unbedingt die Anweisungen in den „Bereitstellungsanforderungen“ der HSTS-Preload-Liste, wenn dies beabsichtigt ist.https://hstspreload.org/#deployment-recommendations
Alternative, um dies umzusetzen in.htaccess
(NB: Ich habe die Weiterleitung mit dem „abschließenden Schrägstrich“ nicht implementiert, da Sie dies in Ihren Anforderungen nicht erwähnt haben und es sich lediglich um einen Teil des aus dem externen Artikel kopierten Codes handelt.)
# 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
Die always
Bedingung ist in der Header
Anweisung erforderlich, sodass der Header bei Antworten, die nicht „200 OK“ lauten, gesetzt wird. Das heißt, er muss bei der HTTPS 301-Weiterleitung von „Nicht-www“ zu „www“ gesetzt werden.
Siehe auchmeine Antwortauf folgende Frage auf CodeReview SE bezüglich der Implementierung von HSTS in .htaccess
: