Ich versuche, alle unsicheren HTTP-Anforderungen auf meiner Site (z. B. http://www.example.com
) an HTTPS ( https://www.example.com
) umzuleiten . Ich benutze übrigens PHP. Kann ich dies in .htaccess tun?
http://
Ich versuche, alle unsicheren HTTP-Anforderungen auf meiner Site (z. B. http://www.example.com
) an HTTPS ( https://www.example.com
) umzuleiten . Ich benutze übrigens PHP. Kann ich dies in .htaccess tun?
http://
Antworten:
Update: Obwohl diese Antwort vor einigen Jahren akzeptiert wurde, beachten Sie, dass der Ansatz jetzt in der Apache-Dokumentation empfohlen wird. Verwenden Sie Redirect
stattdessen ein. Siehe diese Antwort .
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
http://server/foo?email=someone%40example.com
Weiterleitungen zu https://server/foo?email=someone%2540example.com
dem Zeichen "@" zweimal mit URL-Anführungszeichen versehen . Bei Verwendung der Methode in der Antwort von @ ssc tritt dieses Problem nicht auf.
In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.
In den Apache-Dokumenten wird davon abgeraten, ein Umschreiben durchzuführen:
http
Gehen Sie wiehttps
folgt vor, um URLs an 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 Konfigurationsdatei des Hauptservers aufgenommen werden, nicht in .htaccess
die in der Frage gestellte.
Dieser Artikel ist möglicherweise erst erschienen, nachdem die Frage gestellt und beantwortet wurde, scheint aber der aktuelle Weg zu sein.
permanent
Schlüsselwort verwenden, ist der Effekt der gleiche (der Browser erhält eine 301-Weiterleitung). ZB:Redirect permanent "/" "https://example.com"
Ich würde mit 301 Redirect empfehlen:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
[L]
Wie ich in dieser Frage sagte , würde ich vorschlagen, dass Sie vermeiden, alle HTTP-Anforderungen blind auf ihre HTTPS-Entsprechung umzuleiten, da dies zu einem falschen Eindruck von Sicherheit führen kann. Stattdessen sollten Sie wahrscheinlich das "Stammverzeichnis" Ihrer HTTP-Site zum Stammverzeichnis Ihrer HTTPS-Site umleiten und von dort aus nur auf HTTPS verlinken.
Das Problem besteht darin, dass der Inhalt vor der Umleitung sichtbar wird, wenn der Client durch einen Link oder ein Formular auf der HTTPS-Site eine Anfrage an die HTTP-Site sendet.
Wenn beispielsweise eine Ihrer über HTTPS bereitgestellten Seiten ein Formular enthält, in dem <form action="http://example.com/doSomething">
einige Daten angegeben und gesendet werden, die nicht eindeutig gesendet werden sollen, sendet der Browser zunächst die vollständige Anforderung (einschließlich der Entität, wenn es sich um einen POST handelt) an die HTTP-Site zuerst. Die Umleitung wird sofort an den Browser gesendet. Da eine große Anzahl von Benutzern die Warnungen deaktiviert oder ignoriert, wird sie wahrscheinlich ignoriert.
Natürlich kann der Fehler, die Links bereitzustellen, die zur HTTPS-Site führen sollen, aber letztendlich für die HTTP-Site gelten, Probleme verursachen, sobald Sie den HTTP-Port unter derselben IP-Adresse wie Ihre HTTPS-Site abhören. Ich denke jedoch, dass die Beibehaltung der beiden Websites als "Spiegel" nur die Wahrscheinlichkeit von Fehlern erhöht, da Sie möglicherweise davon ausgehen, dass sie sich automatisch korrigieren, indem sie den Benutzer zu HTTPS umleiten, obwohl es oft zu spät ist. (In dieser Frage gab es ähnliche Diskussionen . )
Ich fand heraus, 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]
http://www.example.com/...
da die beiden Bedingungen implizit UND-verknüpft sind. Sie sollten stattdessen ODER sein, dh. Fügen Sie das OR
Flag in die erste Bedingung ein (und denken Sie daran, die wörtlichen Punkte im regulären Ausdruck zu umgehen). Aber wenn Sie implementieren HSTS dann wollen Sie nicht auf HTTPS und www in einer einzigen Umleitung umleiten, sollten Sie auf HTTPS umleiten zuerst .
Dies ist der HTML-Umleitungsansatz, 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");
}
}
?>
.htaccess Ansatz
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
kopiert von: www.letuslook.org
.htaccess
es? Auch dieser Link ist tot.
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]
Wenn Sie den folgenden Code in Ihrer .htaccess-Datei verwenden, werden Besucher automatisch zur HTTPS-Version Ihrer Website weitergeleitet:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Wenn Sie eine vorhandene .htaccess-Datei haben:
Duplizieren Sie RewriteEngine On nicht.
Stellen Sie sicher, dass die Zeilen, die mit RewriteCond und RewriteRule beginnen, unmittelbar auf die bereits vorhandene RewriteEngine On folgen.
Dies ist die richtige Methode zum Umleiten von HTTP zu HTTPS mithilfe von .htaccess gemäß GoDaddy.com. Die erste Codezeile ist selbsterklärend. In der zweiten Codezeile wird überprüft, ob HTTPS deaktiviert ist. In diesem Fall wird HTTP durch Ausführen der dritten Codezeile an HTTPS umgeleitet. 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-automatically-8828
Die beste Lösung hängt von Ihren Anforderungen ab. Dies ist eine Zusammenfassung der zuvor veröffentlichten Antworten, wobei ein Kontext hinzugefügt wurde.
Wenn Sie mit dem Apache-Webserver arbeiten und dessen Konfiguration ändern können, befolgen Sie die 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 die Browser sich an diese Weiterleitung erinnern sollen, können Sie sie als dauerhaft deklarieren, 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 können. Browser erinnern sich sehr lange daran und werden nicht prüfen, ob es sich geändert hat.
RewriteEngine On
Abhängig von der Webserverkonfiguration benötigen Sie möglicherweise nicht die erste Zeile .
Wenn Sie nach einer PHP-Lösung suchen, sehen Sie sich das Array $ _SERVER und die Header-Funktion an :
if (!$_SERVER['HTTPS']) {
header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}
.htaccess
Datei sonst noch enthalten?
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 auch bestimmte Ordner von Ihrem Domain-Namen umleiten, indem Sie die letzte Zeile des obigen Codes durch Folgendes ersetzen:
RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
Tun Sie alles, was oben für die Umleitung erklärt wurde. Fügen Sie einfach "HTTP Strict Transport Security" zu Ihrem Header hinzu. Dies vermeidet Menschen im mittleren Angriff.
Bearbeiten Sie beispielsweise Ihre Apache-Konfigurationsdatei (/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
Um alle http
Anfragen an umzuleiten https
, 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 Apache 2.4 verwenden, können Sie auch eine Redirect
Inside- if
Direktive verwenden, um http
Anforderungen an umzuleiten https
.
Apache 2.4.
<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
Wenn Sie sich in einer Situation befinden, in der Sie nicht direkt auf die Apache-Konfiguration für Ihre Site zugreifen können, für die viele gehostete Plattformen immer noch auf diese Weise eingeschränkt sind, würde ich einen zweistufigen Ansatz empfehlen. Der Grund, warum Apache selbst dokumentiert, dass Sie ihre Konfigurationsoptionen in erster Linie über mod_rewrite für HTTP zu HTTPS verwenden sollten.
Zunächst 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 dies für Ihre Situation angemessen ist) leiten einige Websites alle Anforderungen über eine einzige PHP-Datei, andere bedienen je nach Bedarf und Anforderung verschiedene Seiten ):
<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>
Das oben Gesagte 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 Skripte sicherstellen, dass keine Ausgabe bereitgestellt wird, wenn nicht über HTTPS zugegriffen wird.
Ich denke, die meisten Leute denken nicht so, und daher empfiehlt Apache, diese Methode nach Möglichkeit nicht zu verwenden. Es ist jedoch nur eine zusätzliche Überprüfung am Ende der Entwicklung erforderlich, um sicherzustellen, dass die Daten Ihres Benutzers sicher sind. Hoffentlich hilft dies jemand anderem, der aufgrund von Einschränkungen bei unseren Hosting-Diensten möglicherweise nicht empfohlene Methoden anwenden 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]
Weitere Informationen finden Sie hier. Wie leite ich HTTP zu HTTP um?
Sofern Sie mod_rewrite nicht für andere Zwecke benötigen, ist die Verwendung der Apache Core IF-Direktive sauberer 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 sicherstellen:
<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>
Die Verwendung von mod_rewrite für alles ist sehr vertraut, 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 Site, an der ich arbeite).
Nehmen 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]
Ich habe eine Methode gefunden, mit der alle Seiten meiner Website von http auf analog zu Seiten auf https umgeleitet werden können, die für mich funktionieren.
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Dadurch werden alle URLs zu https und www umgeleitet
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTPS_HOST} !^www.example.com$ [NC,OR]
RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Wenn Sie dies vom Tomcat-Server aus tun möchten, führen Sie die folgenden Schritte aus
Wie kann ein eigenständiger Apache Tomcat (8.5.x) HTTP-Server so konfiguriert werden, dass ein Benutzer, der www.domain.com eingibt, automatisch an die https-Site (www.domain.com) weitergeleitet wird?
Die 2-Schritt-Methode zum Einfügen der folgenden Elemente in Ihre [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 und versucht haben, umzuleiten, führen Sie nur Schritt 1 aus.
Wenn Sie Apache verwenden, ist mod_rewrite die einfachste Lösung und verfügt über zahlreiche Online-Dokumentationen. 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: - Der Datenverkehr vom Browser zum Load Balancer und zurück ist (sollte) HTTPS. - Der Datenverkehr zwischen dem Load Balancer und dem tatsächlichen WebServer ist HTTP.
Alle Serveranforderungsvariablen in PHP oder Apache zeigen also, dass die Verbindung nur HTTP ist. Die Verzeichnisse HTTP und HTTPS 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 funktioniert das auf einem Load Balancer?
(Oder ist der Load Balancer falsch konfiguriert? Was ich mir erhoffe, weil ich das Problem dann auf die WebHosting-Firma übertragen kann :-))
Wenn Sie einen Amazon Web Services Elastic Load Balancer verwenden, der https-Verkehr akzeptiert und ihn mit http an Ihre Server weiterleitet, wird hier die richtige Methode zum Umleiten des gesamten http-Verkehrs zu https 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-.htaccess-Datei:
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.
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 normal ohne Probleme weiter. Die Datei .htaccess im Stammverzeichnis der Website (z. B. public_html). Es ist möglich, RewriteCond% {SERVER_PORT}! ^ 443 $ anstelle von RewriteCond% {HTTPS}! On zu verwenden
httpd
, nicht mit PHP tun .