Ich versuche, alle unsicheren HTTP-Anforderungen auf meiner Website (z. B. http://www.example.com
) an HTTPS (https://www.example.com
) umzuleiten. Ich verwende PHP übrigens. Kann ich das in .htaccess machen?
Update: Obwohl diese Antwort vor einigen Jahren akzeptiert wurde, beachten Sie, dass ihr Ansatz jetzt gegen 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}
Die Apache-Dokumente empfehlen die Verwendung einer Umschreibung:
Führen Sie folgende Schritte aus, um
http
-URLs zuhttps
umzuleiten:<VirtualHost *:80> ServerName www.example.com Redirect / https://www.example.com/ </VirtualHost> <VirtualHost *:443> ServerName www.example.com # ... SSL configuration goes here </VirtualHost>
Dieses Snippet sollte in die Hauptserver-Konfigurationsdatei not in .htaccess
aufgenommen werden, wie in der Frage gestellt.
Dieser Artikel ist möglicherweise erst nach der Frage und Antwort der Frage aufgetaucht, scheint jedoch der derzeitige Weg zu sein.
Ich würde mit 301 Weiterleitung empfehlen:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
Wie ich in diese Frage sagte, würde ich vorschlagen, dass Sie vermeiden, alle HTTP-Anfragen blind zu ihrem HTTPS-Äquivalent umzuleiten, da dies einen falschen Eindruck von Sicherheit hervorrufen kann. Stattdessen sollten Sie das "Stammverzeichnis" Ihrer HTTP-Site wahrscheinlich zum Stammverzeichnis Ihrer HTTPS-Site umleiten und von dort aus nur auf HTTPS verlinken.
Das Problem ist, dass, wenn ein Link oder ein Formular auf der HTTPS-Site dazu führt, dass der Client eine Anforderung an die HTTP-Site sendet, sein Inhalt vor der Umleitung sichtbar ist.
Wenn beispielsweise eine Ihrer über HTTPS bereitgestellten Seiten über ein Formular mit der Aufschrift <form action="http://example.com/doSomething">
verfügt, das einige Daten sendet, die nicht eindeutig gesendet werden sollten, sendet der Browser zunächst die vollständige Anforderung (einschließlich Entität, falls es sich um einen POST handelt) an HTTP Site zuerst. Die Umleitung wird sofort an den Browser gesendet. Da eine große Anzahl von Benutzern die Warnungen deaktivieren oder ignorieren, wird sie wahrscheinlich ignoriert.
Natürlich kann der Fehler beim Bereitstellen der Links, die zur HTTPS-Site gehören sollten, aber letztendlich für die HTTP-Site gelten, Probleme verursachen, sobald der HTTP-Port an derselben IP-Adresse wie Ihre HTTPS-Site überwacht wird. Ich denke jedoch, dass die Beibehaltung der beiden Sites als "Spiegel" nur die Wahrscheinlichkeit von Fehlern erhöht, da Sie die Annahme vertreten, dass sie sich automatisch korrigiert, indem Sie den Benutzer auf HTTPS umleiten, während es oft zu spät ist. (Es gab ähnliche Diskussionen in dieser Frage. )
Ich habe herausgefunden, dass der beste Weg für https und www auf Domain ist
RewriteCond %{HTTPS} off
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Dies ist der HTML-Redirect-Ansatz, der funktioniert, aber nicht der beste.
<meta http-equiv="Refresh" content="0;URL=https://www.example.com" />
PHP-Ansatz
<?php
function redirectTohttps() {
if ($_SERVER['HTTPS']!="on") {
$redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
header("Location:$redirect");
}
}
?>
.zugriffsannäherung
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
kopiert von: www.letuslook.org
Ich mag diese Methode der Umleitung von http zu https. Weil ich es nicht für jede Site bearbeiten muss.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
Dies ist die richtige Methode zum Umleiten von HTTP zu HTTPS mithilfe von .htaccess gemäß GoDaddy.com. Die erste Codezeile ist selbsterklärend. Die zweite Codezeile prüft, ob HTTPS deaktiviert ist, und leitet HTTP in HTTPS um, indem die dritte Codezeile ausgeführt wird. Anderenfalls 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-automatically-8828
Die beste Lösung hängt von Ihren Anforderungen ab. Dies ist eine Zusammenfassung der zuvor geposteten Antworten mit zusätzlichem Kontext.
Wenn Sie mit dem Apache-Webserver arbeiten und dessen Konfiguration ändern können, folgen Sie der Apache-Dokumentation :
<VirtualHost *:80>
ServerName www.example.com
Redirect "/" "https://www.example.com/"
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.com
# ... SSL configuration goes here
</VirtualHost>
Sie haben aber auch gefragt, ob Sie dies in einer .htaccess
-Datei tun können. In diesem Fall können Sie Apaches RewriteEngine verwenden:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]
Wenn alles einwandfrei funktioniert und Sie möchten, dass sich die Browser an diese Weiterleitung erinnern, können Sie sie als permanent definieren, indem Sie die letzte Zeile in Folgendes ändern:
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
Aber seien Sie vorsichtig, wenn Sie Ihre Meinung zu dieser Weiterleitung ändern. Browser erinnern sich sehr lange daran und prüfen nicht, ob sich etwas geändert hat.
Je nach Konfiguration des Webservers benötigen Sie möglicherweise nicht die erste Zeile RewriteEngine On
.
Wenn Sie nach einer PHP -Lösung suchen, schauen Sie sich das $ _SERVER-Array und die Header-Funktion an:
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']);
}
Wenn Sie den folgenden Code in Ihrer .htaccess-Datei verwenden, werden Besucher automatisch zur HTTPS-Version Ihrer Site umgeleitet:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Wenn Sie eine .htaccess-Datei haben:
RewriteEngine On nicht duplizieren.
Stellen Sie sicher, dass die Zeilen, die mit RewriteCond und RewriteRule beginnen, unmittelbar auf die bereits vorhandene 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]
Wobei [Ihr Domainname] der Domainname Ihrer Website ist.
Sie können bestimmte Ordner auch von Ihrem Domainnamen umleiten, indem Sie die letzte Zeile des obigen Codes durch Folgendes ersetzen:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Machen Sie alles, was oben für die Weiterleitung erklärt wurde. Fügen Sie Ihrem Header einfach "HTTP Strict Transport Security" hinzu. Dies vermeidet einen Mann im mittleren Angriff.
Bearbeiten Sie Ihre Apache-Konfigurationsdatei (beispielsweise /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
<VirtualHost 67.89.123.45:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
Wenn Sie sich in einer Situation befinden, in der Sie nicht direkt auf die Apache-Konfiguration für Ihre Site zugreifen können, was bei vielen gehosteten Plattformen auf diese Weise noch eingeschränkt ist, würde ich tatsächlich einen zweistufigen Ansatz empfehlen. Der Grund, warum Apache selbst dokumentiert, dass Sie seine Konfigurationsoptionen in erster Linie über mod_rewrite für HTTP zu HTTPS verwenden sollten.
Als erstes würden Sie, wie oben erwähnt, Ihre .htaccess mod_rewrite-Regel (n) einrichten:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
In Ihren PHP -Dateien (Sie müssen dies tun, wo immer es für Ihre Situation angemessen wäre), werden einige Websites alle Anforderungen durch eine einzige PHP -Datei leiten zu ihren Bedürfnissen und zur Anfrage):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
Das Vorstehende muss vor jedem Code ausgeführt werden, der möglicherweise sichere Daten in einer ungesicherten Umgebung verfügbar macht. Daher verwendet Ihre Site eine automatische Umleitung über HTACCESS und mod_rewrite, während Ihr Skript bzw. Ihre Skripte sicherstellen, dass keine Ausgabe bereitgestellt wird, wenn nicht über HTTPS zugegriffen wird.
Ich denke, dass die meisten Leute nicht so denken, und daher empfiehlt Apache, dass Sie diese Methode möglichst nicht verwenden. Es ist jedoch nur eine zusätzliche Überprüfung des Entwicklungsendes erforderlich, um sicherzustellen, dass die Daten Ihrer Benutzer sicher sind. Hoffentlich hilft dies einer anderen Person, die aufgrund von Einschränkungen bei unseren Hosting-Diensten möglicherweise nicht-empfohlene Methoden verwenden muss.
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 für mehr Details. Wie HTTP zu HTTPS umleiten?
Wenn Sie mod_rewrite nicht für andere Zwecke benötigen, ist die Verwendung der Apache-Direktive IF einfacher und schneller:
<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>
Sie können der IF-Direktive weitere Bedingungen hinzufügen, z. B. eine einzelne kanonische Domäne ohne das Präfix "www":
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
Bei der Verwendung von mod_rewrite für alles gibt es eine gewisse Trägheit der Vertrautheit, 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 (versuchen Sie es ohne www. Oder https: // oder mit .net anstelle von .com): https://nohodental.com/ (eine Seite, an der ich gerade arbeite).
Um alle http
-Anforderungen an https
umzuleiten, können Sie Folgendes verwenden:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]
Wenn mod-rewrite nicht aktiviert ist und Sie sich in Apache 2.4 befinden, können Sie auch eine Redirect
-Anweisung in if
verwenden, um http
-Anforderungen an https
umzuleiten.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Ich habe eine Methode gefunden, mit der alle Seiten meiner Website von http auf analoge Seiten auf https umgeleitet werden, die für mich funktionieren.
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 es gibt eine Menge Dokumentation online, wie das geht. Zum Beispiel: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html
Wenn Sie dies vom Tomcat-Server aus tun möchten, führen Sie die folgenden Schritte aus
Wie kann ein eigenständiger HTTP-Server von Apache Tomcat (8.5.x) konfiguriert werden, wenn ein Benutzer www.domain.com eingibt, wird er automatisch an die Website https (www.domain.com) weitergeleitet.
Die 2-Schritt-Methode zum Einfügen der folgenden Elemente in Ihre Datei [Tomcat_base] /conf/web.xml vor dem schließenden Tag
step 1:
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
und Festlegen der Connector-Einstellungen für [Tomcat_base] /conf/server.xml:
step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>
Hinweis: Wenn Sie bereits die https-Konfiguration vorgenommen haben und umleiten möchten, führen Sie nur Schritt 1 aus.
Ein anderer Vorteil dieses Problems ist, wenn ein Load Balancer ins Spiel kommt.
Die Situation ist wie folgt: - Verkehr vom Browser zu Load Balancer und zurück (ist) HTTPS - Der Verkehr zwischen Load Balancer und dem tatsächlichen WebServer ist HTTP.
Daher zeigen alle Serveranforderungsvariablen in PHP oder Apache, dass die Verbindung nur HTTP ist. 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.
Die Frage ist: Wie kann man das an einem Load Balancer zum Laufen bringen?
(Oder ist der Load Balancer falsch konfiguriert. Was ich hoffe, da ich das Problem dann an die WebHosting-Firma übergeben kann :-))
bringen Sie diesen Code zu Ihrer .htaccess-Datei. Leiten Sie HTTP automatisch zu HTTPS um.
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Für mich geht das:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>
und zum Beispiel http: // server/foo? email = jemand% 40example.com leitet normalerweise ohne Probleme um . Die Datei .htaccess befindet sich im Stammordner der Website (beispielsweise mit dem Namen public_html) .Es ist möglich, RewriteCond% {SERVER_PORT}! ^ 443 $ stattdessen RewriteCond% {HTTPS}! Zu verwenden. On
Redirect 301 / https://example.com/
(Hat bei mir funktioniert, als keine der obigen Antworten funktioniert hat)
Bonus:
ServerAlias www.example.com example.com
(Fehler behoben: https: // www . example.com nicht gefunden)
Wenn Sie einen Elastic Load Balancer von Amazon Web Services verwenden, der https-Datenverkehr akzeptiert und ihn mit http an Ihre Server weiterleitet, wird der korrekte Weg, den gesamten http-Datenverkehr zu https umzuleiten, hier beschrieben: https: // aws. Amazon.com/premiumsupport/knowledge-center/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-forwarded-headers.html
In der Datei httpd.conf:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
Oder in Ihrer root-Datei .htaccess:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
Bonus: Es wird nicht versucht, den HTTP-Verkehr auf Ihrem lokalen Entwicklungscomputer umzuleiten.