So leiten Sie alle HTTP-Anfragen an HTTPS weiter

Ich versuche, alle unsicheren HTTP-Anfragen auf meiner Website (zB http://www.example.com ) an HTTPS ( https://www.example.com ) umzuleiten. Ich benutze PHP BTW. Kann ich dies in .htaccess tun?

   

Update: Obwohl diese Antwort vor ein paar Jahren akzeptiert wurde, beachten Sie, dass ihr Ansatz jetzt von der Apache-Dokumentation empfohlen wird. Verwenden Sie stattdessen eine Redirect . Siehe diese Antwort .


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

Quelle

Die Apache-Dokumente empfehlen, eine Neuschreibung zu verwenden:

https Sie die folgenden https , um http URLs zu https umzuleiten:

  ServerName www.example.com Redirect / https://www.example.com/   ServerName www.example.com # ... SSL configuration goes here  

Dieses Snippet sollte in die Hauptserverkonfigurationsdatei und nicht in .htaccess wie in der Frage gefragt, gehen.

Dieser Artikel ist möglicherweise erst erschienen, nachdem die Frage gestellt und beantwortet wurde, scheint aber der aktuelle Weg zu sein.

Ich würde mit 301 Redirect empfehlen:

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

Wie ich in dieser Frage gesagt habe , würde ich vorschlagen, dass Sie vermeiden, dass alle HTTP-Anfragen blind an ihr HTTPS-Äquivalent weitergeleitet werden, da dies möglicherweise einen falschen Eindruck von Sicherheit verursacht. Stattdessen sollten Sie den “root” Ihrer HTTP-Site wahrscheinlich zum Stamm Ihrer HTTPS-Site redirect und von dort nur zu HTTPS verlinken.

Das Problem besteht darin, dass, wenn ein Link oder ein Formular auf der HTTPS-Site den Client dazu veranlasst, eine Anforderung an die HTTP-Site zu senden, dessen Inhalt vor der Umleitung sichtbar ist.

Wenn zum Beispiel eine Ihrer über HTTPS versorgten Seiten ein Formular mit der Form

und einige Daten sendet, die nicht gesendet werden sollen, sendet der Browser zuerst die vollständige Anfrage (einschließlich Entität, wenn es sich um einen POST handelt) an die HTTP-Site zuerst. Die Umleitung wird sofort an den Browser gesendet, und da eine große Anzahl von Benutzern die Warnungen deaktiviert oder ignoriert, wird sie wahrscheinlich ignoriert.

Natürlich kann der Fehler, die Links zur HTTPS-Site bereitzustellen, die für die HTTP-Site bestimmt sind, zu Problemen führen, sobald Sie etwas auf dem HTTP-Port an derselben IP-Adresse wie Ihre HTTPS-Site abhören. Ich denke jedoch, dass das Beibehalten der beiden Seiten als “Spiegel” nur die Wahrscheinlichkeit erhöht, Fehler zu machen, da Sie wahrscheinlich die Annahme machen, dass es sich automatisch korrigiert, indem es den Benutzer zu HTTPS umleitet, während es oft zu spät ist. (Es gab ähnliche Diskussionen in dieser Frage. )

Ich fand heraus, dass der beste Weg für https und www auf Domain ist

 RewriteCond %{HTTPS} off RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC] RewriteRule ^(.*)$ https://www.cheapcarhire.gr/$1 [L,R=301] 

Dies ist der HTML-Redirect-Ansatz, es funktioniert aber nicht das Beste.

   

PHP-Ansatz

 < ?php function redirectTohttps() { if ($_SERVER['HTTPS']!="on") { $redirect= "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; header("Location:$redirect"); } } ?> 

.htaccess Annäherung

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

kopiert von: http://www.letuslook.org

Ich mag diese Methode der Umleitung von http zu https. Weil ich es nicht für jede Seite bearbeiten muss.

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

Wenn Sie den folgenden Code in Ihrer .htaccess-Datei verwenden, werden Besucher automatisch zur HTTPS-Version Ihrer Site weitergeleitet:

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

Wenn Sie eine vorhandene .htaccess-Datei haben:

Dupliziere RewriteEngine On nicht.

Stellen Sie sicher, dass die Zeilen, die RewriteCond und RewriteRule beginnen, sofort der bereits vorhandenen RewriteEngine On folgen.

Fügen Sie der .htaccess-Datei den folgenden Code hinzu:

 Options +SymLinksIfOwnerMatch RewriteEngine On RewriteCond %{SERVER_PORT} !=443 RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L] 

Wo [Ihr Domain-Name] ist der Domain-Name Ihrer Website.

Sie können bestimmte Ordner auch von Ihrem Domain-Namen redirect, indem Sie die letzte Zeile des obigen Codes durch ersetzen:

 RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L] 

Dies ist die richtige Methode zum Umleiten von HTTP zu HTTPS mit. Htaccess nach GoDaddy.com. Die erste Codezeile ist selbsterklärend. Die zweite Codezeile prüft, ob HTTPS deaktiviert ist, und wenn dies der Fall ist, leitet sie HTTP zu HTTPS um, indem sie die dritte Codezeile ausführt, andernfalls wird die dritte Codezeile ignoriert.

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

https://www.godaddy.com/help/redirect-http-to-https-automatisch-8828

Die beste Lösung hängt von Ihren Anforderungen ab. Dies ist eine Zusammenfassung der zuvor geposteten Antworten mit einigen hinzugefügten Kontexten.

Wenn Sie mit dem Apache-Webserver arbeiten und seine Konfiguration ändern können, folgen Sie der Apache-Dokumentation :

  ServerName www.example.com Redirect "/" "https://www.example.com/"   ServerName www.example.com # ... SSL configuration goes here  

Sie haben aber auch gefragt, ob Sie das in einer .htaccess Datei machen können. In diesem Fall können Sie die RewriteEngine von Apache verwenden :

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

Wenn alles in Ordnung ist und Sie möchten, dass Browser sich an diese Weiterleitung erinnern, können Sie sie als dauerhaft festlegen, indem Sie die letzte Zeile ändern in:

 RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Aber seien Sie vorsichtig, wenn Sie Ihre Meinung zu dieser Weiterleitung ändern können. Browser erinnern sich sehr lange daran und überprüfen nicht, ob sich das geändert hat.

Abhängig von der Konfiguration des Webservers benötigen Sie möglicherweise nicht die erste Zeile RewriteEngine On .

Wenn Sie nach einer PHP-Lösung suchen, sehen Sie sich das Array $ _SERVER und die Header-function an :

 if (!$_SERVER['HTTPS']) { header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); } 

Tun Sie alles, was oben für die Umleitung erklärt wurde. Fügen Sie einfach “HTTP Strict Transport Security” zu Ihrer Kopfzeile hinzu. Dies wird den Menschen im mittleren Angriff vermeiden.

Bearbeiten Sie Ihre Apache-Konfigurationsdatei (zum Beispiel /etc/apache2/sites-enabled/website.conf und /etc/apache2/httpd.conf) und fügen Sie Ihrem VirtualHost folgendes hinzu:

 # Optionally load the headers module: LoadModule headers_module modules/mod_headers.so  Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"  

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

Um alle http Anfragen an https umzuleiten, können Sie Folgendes verwenden:

 RewriteEngine on RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R] 

Wenn das Mod-Rewrite nicht aktiviert ist und Sie sich auf Apache 2.4 befinden, können Sie auch eine Redirect statement verwenden, um http Anfragen an https umzuleiten.

Apache 2.4.

  Redirect / https://www.example.com/  

Durch .htaccess Dies wird helfen.

 RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 

Siehe auch unter Weitere Details. Wie man HTTP zu Https umlenkt?

Sofern Sie für andere Dinge nicht mod_rewrite benötigen, ist die Verwendung der Apache core IF-statement sauberer und schneller:

  Redirect permanent / https://yoursite.com/  

Sie können der IF-statement weitere Bedingungen hinzufügen, z. B. eine einzelne kanonische Domäne ohne das Präfix www sicherstellen:

  Redirect permanent / https://myonetruesite.com/  

Es gibt viel Vertrautheitsträgheit bei der Verwendung von mod_rewrite für alles, aber sehen Sie, ob dies für Sie funktioniert.

Weitere Informationen: https://httpd.apache.org/docs/2.4/mod/core.html#if

Um es in Aktion zu sehen (ohne www. Oder https: //, oder mit .net anstelle von .com): https://nohodental.com/ (eine Site, an der ich gerade arbeite).

Wenn Sie in einer Situation sind, in der Sie nicht direkt auf die Apache-Konfiguration für Ihre Site zugreifen können, die viele gehostete Plattformen auf diese Weise noch eingeschränkt sind, würde ich tatsächlich einen zweistufigen Ansatz empfehlen. Der Grund, warum Apache selbst dokumentiert, dass Sie ihre Konfigurationsoptionen in erster Linie über die Mod_rewrite für HTTP zu HTTPS verwenden sollten.

Zuerst, wie oben erwähnt, würden Sie Ihre .htaccess mod_rewrite Regel (en) einrichten:

 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Dann, in Ihren PHP-Dateien (Sie müssen dies tun, wo immer es für Ihre Situation angemessen wäre, einige Seiten werden alle Anfragen über eine einzige PHP-Datei trichterieren, andere bedienen verschiedene Seiten je nach ihren Bedürfnissen und der Anfrage ):

 < ?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?> 

Das oben Genannte muss VOR jedem Code ausgeführt werden, der möglicherweise sichere Daten in einer ungesicherten Umgebung verfügbar macht. Daher verwendet Ihre Site die automatische Umleitung über HTACCESS und mod_rewrite, während Ihre Skripts sicherstellen, dass keine Ausgabe bereitgestellt wird, wenn nicht über HTTPS zugegriffen wird.

Ich denke, die meisten Leute denken nicht so, und daher empfiehlt Apache, dass Sie diese Methode nicht verwenden, wo es möglich ist. Es erfordert jedoch nur eine zusätzliche Überprüfung des Entwicklungsendes, um sicherzustellen, dass die Daten Ihres Benutzers sicher sind. Hoffentlich hilft das jemand anderem, der aufgrund von Einschränkungen unserer Hosting-Services nach nicht empfohlenen Methoden suchen muss.

Ich habe eine Methode gefunden, um alle Seiten meiner Site-Weiterleitung von http zu Analog von Seiten auf HTTPS zu erzwingen, die für mich arbeiten.

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

Wenn Sie Apache verwenden, ist mod_rewrite die einfachste Lösung und hat online eine Menge an Dokumentation, wie Sie das tun können. Zum Beispiel: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

Ein anderer Vorteil dieses Problems ist, wenn ein Load Balancer ins Spiel kommt.

Die Situation ist wie folgt: – Verkehr von Browser zu Load Balancer und zurück, ist (sollte sein) HTTPS – Verkehr zwischen Load Balancer und tatsächlichen WebServer ist HTTP.

Alle Serveranforderungsvariablen in PHP oder Apache zeigen also, dass die Verbindung nur HTTP ist. Und die HTTP- und HTTPS-Verzeichnisse auf dem Server sind identisch.

Die RewriteCondition in der genehmigten Antwort funktioniert nicht. Es gibt entweder eine Schleife oder es funktioniert einfach nicht.

Frage ist: Wie funktioniert das mit einem Load Balancer?

(Oder der Load Balancer falsch konfiguriert ist. Was ich mir erhofft habe, denn dann kann ich das Problem auf die WebHosting Firma übertragen :-))

Wenn Sie einen Elastic Load Balancer von Amazon Web Services verwenden, der https-Datenverkehr zulässt und ihn über http an Ihre Server weiterleitet, wird hier die korrekte Methode zum Umleiten des gesamten http-Datenverkehrs auf https beschrieben: https: //aws.amazon. com / premiumsupport / wissenschaftszentrum / redirect-http-https-elb

Verwenden Sie den X-Forwarded-Proto-Header (enthält http oder https), der immer in http-Anforderungen vom Load Balancer enthalten ist, wie hier beschrieben: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x- Weitergeleitet-Header.html

In der httpd.conf Datei:

  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]  

Oder in Ihrer root .htaccess-Datei:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] 

Bonus: Es wird nicht versucht, HTTP-Verkehr auf Ihrem lokalen Entwicklungscomputer umzuleiten.