it-swarm.com.de

So leiten Sie alle HTTP-Anforderungen an HTTPS um

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?

254
Cat

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}

Quelle

262
Reese Moore

Die Apache-Dokumente empfehlen die Verwendung einer Umschreibung:

Führen Sie folgende Schritte aus, um http-URLs zu https 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.

305
ssc

Ich würde mit 301 Weiterleitung empfehlen:

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

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. )

33
Bruno

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]
17
GiorgosK

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

12

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]
9
Cory

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

6
AnarchyOutlaw

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']); 
} 
6
maikel

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.

6
OpenWebWar

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]
5
Rahul

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

4
Waqas

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.

3
F. Scott Gale

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?

2
Roshan Padole

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).

2
SashaK

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>
2
starkeen

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]
1
Oleg Apanovich

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

0
vcsjones

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.

0
Bhaskara Arani

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 :-))

0
BertC

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]

0
Ehsan Sattari

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

0
Intacto
 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)

0
aalesund

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.

0
ScottyB