2015-03-13 5 views
13

Ich habe nach dem perfekten 301 Redirect gesucht. Aber ich finde so viele Lösungen und weiß nicht, was am besten ist.Best Practice: 301 HTTP zu HTTPS (Standard Domain) umleiten

Hier ist, was ich

Best practice .htacess tun wollen?

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

Dies ist mein bevorzugter Code. Zumindest jetzt unil.

Alternative Wege

Ich fand auch eine Menge anderer Möglichkeiten, HTTP-HTTPS zu umleiten. Zum Beispiel:

1.

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

fehlt ein Schritt? Und nein [R=301,L] hier?

2.

RewriteCond %{HTTP_HOST} !^www\. 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
RewriteCond %{HTTPS} off 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

Is a different order generally better?

Sollte ich

RewriteRule ^(.*)$ 

statt

RewriteRule (.*) 

?

3.

RewriteCond %{HTTPS} off 
RewriteCond %{HTTP_HOST} example\.com$ [NC] 
RewriteRule^https://example.com%{REQUEST_URI} [R=301,L,NE] 

Gibt den vollständigen Domänennamen alle Leistungsvorteile haben mit? Brauche ich wirklich NE? ([R=301,L,NE] vs. [L,R=301])

Also, meine Frage an alle Experten: Was ist die beste (performing) Art und Weise sowohl HTTP-HTTPS zu umleiten und -HTTPS://?

Antwort

13

mit Ihrem Liebling Lösung zu starten:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} off 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule^https://%1%{REQUEST_URI} [R=301,L] 
</IfModule> 

Im Teil Umgang mit Nicht-https-URLs Sie %{HTTP_HOST} umleiten.Wenn Ihr Hostname mit "www" beginnt, muss eine zweite Weiterleitung stattfinden, um Sie von https://www.domain.tld an https://domain.tld zu senden, die Ihr endgültiges Ziel sein soll.

Sie können dies verkürzen, indem

RewriteRule ^(.*)$ https://domain.tld/%{REQUEST_URI} [L,R=301] 

direkt in der ersten Regel. Die zweite Regel würde dann nur für Clients gelten, die versuchen, auf https://www.domain.tld zuzugreifen.

Alternative 1. funktioniert nicht aus dem gleichen Grund (fehlt der Fall, HTTP_HOST könnte www.domain.tld sein) und zusätzlich wegen der fehlenden [L,R=301]. Dies ist notwendig, da Sie hier nicht einfach eine URL neu schreiben, wie Sie es bei anderen Arten von Rewrite-Regeln tun könnten. Sie fordern den Client auf, den Typ der Anfrage zu ändern. Aus diesem Grund senden Sie ihm den HTTP-Code 301.

In Bezug auf die Übereinstimmung Teil der RewriteRule selbst sollten Sie konsistent sein: Wenn Sie Teile des URI erfassen möchten, verwenden Sie einen regulären Ausdruck mit Klammern. Da Sie es tatsächlich als Ganzes hier verwenden, ist es in Ordnung, nur eine der Alternativen für "alles" zu verwenden, wie ^ und später . Wenn Sie einige Capturing verwenden (dh (some_regex) Sie es im Ziel unter Verwendung $1 Referenz sollte (oder was auch immer Sie vorhaben, hier zu verweisen).

In Ihrem dritten Alternative, wieder www + https fehlt.

Sie können überprüfen, ob https ausgeschaltet oder, wenn der Domain-Name eine führende „www“ in einer Regel enthält jedoch Bedingungen umschreiben mit implizit verbunden „und“

So soll es lesen.

RewriteCond %{HTTPS} off   [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule^https://domain.tld%{REQUEST_URI} [R=301,L,NE] 

Die NE ist notwendig für das Bestehen auf Dinge wie GET-Parameter und dergleichen an den neuen unverändert URI finden Sie unter:

http://httpd.apache.org/docs/2.4/rewrite/flags.html

+0

Vielen Dank. Ich verwende diesen Code jetzt: RewriteEngine Ein RewriteCond% {HTTPS} aus RewriteRule^(. *) $ Https://example.com/%{REQUEST_URI} [R = 301, L , NE] RewriteCond% {HTTP_HOST}^www \ (+.) $ [NC] RewriteRule^https:. //% 1% {REQUEST_URI} [R = 301, L, NE] dash

+0

ich weiß, dass es eine etwas alte Antwort, aber nicht 'RewriteRule^https: //domain.tld/% {REQUEST_URI} [R = 301, L, NE]' von Alternative 3 zurück, z https: //domain.tld//index.html mit doppelten Schrägstrichen? Sollte die Zeile nicht nur 'RewriteRule^https: //domain.tld/% {REQUEST_URI} [R = 301, L, NE]' ohne den Schrägstrich zwischen dem statischen Domain-Text und '% {REQUEST_URI}' lesen? –

+0

Sie haben Recht: Ich habe dies korrigiert – nlu

2

So, Kondensieren dies wird;

RewriteEngine On 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP_HOST} ^www\. [NC] 
RewriteRule^https://example.com%{REQUEST_URI} [R=301,L,NE] 

Lassen Sie mich wissen, wenn Sie irgendwelche Fehler sehen