it-swarm.com.de

.htaccess 301 vs. 302 Erzwingen von HTTPS

Für WordPress habe ich zwei verschiedene Techniken zum Bearbeiten der .htaccess-Datei zum Weiterleiten an HTTPS gesehen. Was sind die Vor- und Nachteile davon:

Option # 1

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Bei der Navigation zu www.example.com gibt diese Lösung den Status 302 zurück und leitet den Datenverkehr an https://www.example.com weiter.

Siehe hier .

Option 2

# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Ich glaube, dass diese Lösung den Status 301 zurückgibt. Ich habe nicht getestet, da Option 1 zu funktionieren scheint.

Siehe hier .

Hier ist der relevante Block meiner .htaccess-Datei, bevor Sie eine der beiden Methoden anwenden.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTPS} =on
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{SERVER_PORT} =443
    RewriteRule .* - [E=W3TC_SSL:_ssl]
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteRule .* - [E=W3TC_ENC:_gzip]
    RewriteCond %{HTTP_COOKIE} w3tc_preview [NC]
    RewriteRule .* - [E=W3TC_PREVIEW:_preview]
    RewriteCond %{REQUEST_METHOD} !=POST
    RewriteCond %{QUERY_STRING} =""
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_COOKIE} !(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle) [NC]
    RewriteCond "%{DOCUMENT_ROOT}/wp-content/cache/page_enhanced/%{HTTP_Host}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" -f
    RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_Host}/%{REQUEST_URI}/_index%{ENV:W3TC_SSL}%{ENV:W3TC_PREVIEW}.html%{ENV:W3TC_ENC}" [L]
</IfModule>

Ist es in beiden Fällen richtig, die Einträge RewriteCond und RewriteRule unmittelbar nach RewriteBase / einzufügen?

2

Die verschiedenen .htaccess/mod_rewrite-Direktiven, die Sie sehen, sind normalerweise auf Unterschiede in der Serverkonfiguration (nichts mit WordPress zu tun) und wo sie verwendet werden zurückzuführen. Eine Einheitsgröße gibt es nicht. (Die obige Umleitung funktioniert beispielsweise möglicherweise nicht, wenn Sie sich hinter einem SSL-Proxy befinden.) Wie bei den meisten Dingen gibt es jedoch häufig verschiedene Möglichkeiten, dasselbe zu tun. Sie müssen es also nicht auf eine bestimmte Weise ausführen, damit es einwandfrei funktioniert.

Option 1

RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Standardmäßig arbeitet HTTP an Port 80, auf den hiermit geprüft wird. Sie können HTTP jedoch so konfigurieren, dass es an einem anderen Port funktioniert. In diesem Fall würde dies fehlschlagen.

Wie Sie angegeben haben, handelt es sich hierbei um eine 302 (vorübergehende) Weiterleitung. (Der Standardstatus, wenn Sie den Statuscode nicht explizit mit dem Flag R angeben.) Sofern Sie nichttestingsind, ist eine HTTP-zu-HTTPS-Umleitung voraussichtlich dauerhaft. Sie würden also normalerweise erwarten, dass dies ein 301 ist, d. H. R=301. 301 Weiterleitungen werden von Browsern zwischengespeichert und von Suchmaschinen als permanente Änderung angesehen.

^(.*)$ - genau genommen die Start- und Endanker, dh. ^ und $ sind völlig überflüssig. ^(.*)$ ist dasselbe wie (.*). Einige Benutzer finden jedoch, dass erstere leichter zu lesen sind. Also was auch immer Sie bevorzugen. Dies erfasst einfach den gesamten URL-Pfad und speichert ihn in der $1-Rückreferenz, die später insubstitutionverwendet wird.

https://www.example.com/$1 - Die Hardcodierung deskanonischenHostnamens insubstitutionist wahrscheinlich zuverlässiger. Wenn Sie diesen Code an eine Person weitergeben, die ihn auf ihrer Site verwenden soll, ist die Fehlerquote geringer. Serveradministratoren argumentieren oft, dass dies immer so sein sollte (obwohl ich nicht unbedingt zustimme - ich bin kein Serveradministrator). (Besonders wenn Sie mehrere Domains haben und Unterschiede zwischen www und Nicht-www-Hostnamen haben.) Hardcoding ist jedoch ... naja ... Hardcoding. Es ist also weniger portabel.

Diese Direktive sollte nur in .htaccess (oder einemVerzeichnisKontext) verwendet werden. Wenn Sie dies direkt in der Serverkonfiguration verwenden (nicht das, was Sie tun würden), erhalten Sie einen doppelten Schrägstrich (//) in der umgeleiteten URL.

Option 2

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

HTTPS ist eine von Apache festgelegte Servervariable. Es ist entweder off oder on und funktioniert unabhängig davon, auf welchem ​​Port HTTP (und/oder HTTPS) bedient wird. Es ist wohl auch einfacher zu lesen als SERVER_PORT zu überprüfen. HTTPS ist jedoch auf Apache 1.3 nicht verfügbar (obwohl das eigentlich kein Problem sein sollte!). Auf den meisten Servern besteht kein Unterschied zwischen der Überprüfung von %{SERVER_PORT} 80 und %{HTTPS} off.

R=301 - Gut, es ist eine 301 (permanente) Weiterleitung. Welches ist in der Regel was Sie wollen.

(.*) - Keine unnötigen Anker (siehe oben). Die $1-Rückreferenz wird jedoch nicht insubstitutionverwendet (stattdessen wird %{REQUEST_URI} verwendet), daher sind die Klammern ein unnötiger (geringfügiger) Aufwand und sollten entfernt werden. Dies sollte .* oder einfach ^ sein.

https://%{HTTP_Host}%{REQUEST_URI} - Die Servervariable HTTP_Host enthält den Hostnamen, der in der Anforderung vorhanden ist. Wenn Ihre Site über mehrere Domains erreichbar ist, enthält diese Domain die jeweils angeforderte Domain. Wenn Ihr SSL-Zertifikat nur eine dieser Domänen abdeckt, funktioniert dies nicht mehr. Dies kann auch keine Unterschiede zwischen www und nicht-www konkretisieren. Dies müsstevordieser Anweisung erfolgen, um eine potenzielle doppelte Weiterleitung zu vermeiden (aus diesem Grund wird häufig www angezeigt und HTTPS-Weiterleitungen gemeinsam durchgeführt).

Aufgrund der Verwendung von %{REQUEST_URI} insubstitutionkann diese Regel ohne Änderung entweder in der Serverkonfiguration oder in der .htaccess-Datei verwendet werden.

Option 3

RewriteCond %{HTTPS} off
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

Ist es für beide Lösungen richtig, dass ich die Einträge RewriteCond und RewriteRule unmittelbar nach RewriteBase / hinzufüge?

Ja, das ist ein logischer Ort, um es auszudrücken. (Es könnte jedoch auch vor der Direktive RewriteEngine stehen -technisch, es spielt keine Rolle.)

2
MrWhite