.htaccess leite http zu https um

86

Ich habe eine alte URL ( www1.test.net) und möchte sie weiterleiten, bis https://www1.test.net
ich unser SSL-Zertifikat auf meiner Site implementiert und installiert habe.
Dies ist meine alte Datei .htaccess:

RewriteEngine On
RewriteRule !\.(js|gif|jpg|png|css|txt)$ public/index.php [L]
RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^(.*)$ public/$1 [L]

Wie kann ich meine .htaccessDatei so konfigurieren , dass die URL automatisch umgeleitet wird https?
Vielen Dank!

Bàn Chân Trần
quelle
Wenn die zweite Zeile keine Umleitung durchführen soll, wenn der Pfad auf eine tatsächliche Datei verweist (und Sie die erwarteten möglichen Erweiterungen auflisten), können Sie sie flexibler gestalten, indem Sie sie durch eine Prüfung auf eine vorhandene Datei ersetzen: RewriteCond %{REQUEST_FILENAME} !-f gefolgt von Ihre Weiterleitung.
Diamondsea

Antworten:

116

Update 2016

Da diese Antwort einige Aufmerksamkeit erhält, möchte ich auf eine empfohlene Methode für die Verwendung von virtuellen Hosts hinweisen: Apache: SSL umleiten

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

<VirtualHost _default_:443>
   ServerName mysite.example.com
   DocumentRoot /usr/local/apache2/htdocs
   SSLEngine On
# etc...
</VirtualHost>

Alte Antwort, Hacky-Sache , da Ihr SSL-Port nicht auf 80 eingestellt ist, wird dies funktionieren:

RewriteEngine on

# force ssl
RewriteCond     %{SERVER_PORT} ^80$
RewriteRule     ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Beachten Sie, dass dies Ihre erste Umschreiberegel sein sollte.

Bearbeiten: Dieser Code führt Folgendes aus. Die RewriteCond (ition) prüft, ob der ServerPort der Anforderung 80 ist (dies ist der Standard-http-Port, wenn Sie einen anderen Port angeben, müssten Sie die Bedingung daran anpassen). In diesem Fall passen wir die gesamte URL an (.*)und leiten sie an eine https-URL weiter. %{SERVER_NAME}kann durch eine bestimmte URL ersetzt werden, aber auf diese Weise müssen Sie den Code für andere Projekte nicht ändern. %{REQUEST_URI}ist der Teil der URL nach der TLD (Top-Level-Domain), sodass Sie dorthin weitergeleitet werden, wo Sie herkommen, jedoch als https.

Jojo
quelle
1
Danke, danke ... es funktioniert ...: D Aber, können Sie erklären, warum es funktioniert? ... danke ... ^^
Bàn Chân Trần
1
Ich bin froh, dass es für dich funktioniert hat. Überprüfen Sie die aktualisierte Antwort auf Erklärungen zum Code. Ist das für dich ausreichend?
Jojo
1
"Beachten Sie, dass dies Ihre erste Umschreiberegel sein sollte." @ Jojo rettete mein Leben Mann: *
Ivan Shulev
1
Zur Erklärung hinzufügen. "[Das [L] -Flag ] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_l ) bewirkt, dass mod_rewrite die Verarbeitung des Regelsatzes beendet." Normalerweise möchten Sie dies standardmäßig hinzufügen. "Die Verwendung von [dem [R] -Flag ] ( httpd.apache.org/docs/2.4/rewrite/flags.html#flag_r ) bewirkt, dass eine HTTP-Umleitung an den Browser ausgegeben wird." Wenn dies nicht der Fall ist, erfolgt die Umleitung intern, wodurch die Bedeutung der Verwendung von HTTPS ungültig wird. Standardmäßig hat die ausgegebene Umleitung den Status 302 (temporäre Umleitung). Wenn der Browser die neue URL ("dauerhaft") zwischenspeichern soll, verwenden Sie [R=301]stattdessen.
Jānis Elmeris
1
Bei der VirtualHost-Lösung ist nicht klar, wo bei einer komplizierten Einrichtung die Anweisung "Redirect permanent" platziert werden soll. Ich nahm in der Nähe der Spitze an, und es funktionierte.
eyal_katz
176

Ich verwende Folgendes, um alle Seiten meiner Domain erfolgreich von http nach https umzuleiten:

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

Beachten Sie, dass dies mit der 301 'permanently moved'Weiterleitung umgeleitet wird, wodurch Sie Ihre SEO-Rankings übertragen können.

Umleiten mit der 302 'temporarily moved'Änderung[R=302,L]

Bradley Flood
quelle
5
Dies ist angemessener als die "hacky" akzeptierte Antwort
am05mhz
7
In einigen Fällen wird der X-Forwarded-Proto benötigt RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Kuzeko
1
bei weitem die bessere Antwort hier
skrilled
Dies funktioniert für mich in Godaddy Server. @ Bradley großartig !!
Vishnu
Dies hat bei mir jedes Mal unter verschiedenen Serverumgebungen und Site-Setups funktioniert. Sollte meiner Meinung nach die empfohlene Antwort sein.
John Contarino
59

Dies ist das Beste für www und für https, Proxy- und nicht Proxy-Benutzer.

RewriteEngine On

### WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### WWW & HTTPS
llioor
quelle
1
Wie leite ich zu Nicht-WWW um?
Elyor
Dies ist bei weitem die beste Antwort für diejenigen, wo %{HTTPS} offnicht genug ist
NoodleOfDeath
10

Ich erzwinge das https mit folgendem Code:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Arda
quelle
1
@Niby überprüfe bitte das Datum meiner Antwort und das "das, das schon da ist".
Arda
6

In Fällen, in denen die HTTPS / SSL-Verbindung am Load Balancer beendet wird und der gesamte Datenverkehr an Instanzen auf Port 80 gesendet wird, leitet die folgende Regel nicht sicheren Datenverkehr um.

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

Stellen Sie sicher, dass das mod_rewriteModul geladen ist.

Eneko Alonso
quelle
4

Auf der Suche nach dem besten Weg zur Weiterleitung habe ich Folgendes gefunden (von html5boilerplate):

# ----------------------------------------------------------------------
# | HTTP Strict Transport Security (HSTS)                              |
# ----------------------------------------------------------------------

# Force client-side SSL redirection.
#
# If a user types `example.com` in their browser, even if the server
# redirects them to the secure version of the website, that still leaves
# a window of opportunity (the initial HTTP connection) for an attacker
# to downgrade or redirect the request.
#
# The following header ensures that browser will ONLY connect to your
# server via HTTPS, regardless of what the users type in the browser's
# address bar.
#
# (!) Remove the `includeSubDomains` optional directive if the website's
# subdomains are not using HTTPS.
#
# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/
# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1
# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx

Header set Strict-Transport-Security "max-age=16070400; includeSubDomains"

Vielleicht hilft es 2017 jemandem! :) :)

LIIT
quelle
Im Jahr 2017 sollte dies die akzeptierte Antwort sein. Es sollte jedoch enthalten sein, dass Sie die IfModule-Tags weglassen müssen, um HSTS über die .htacces-Datei zu aktivieren (die Frage ist damit gekennzeichnet). Wenn Sie Ihre Antwort damit bearbeiten, würde ich gerne hier von der akzeptierten Antwort verlinken
Jojo
Hallo Jojo! Entschuldigung für diese späte Antwort, meinst du das Entfernen von Zeilen # <IfModule mod_headers.c>und # </IfModule>Zeilen?
LIIT
hey LIIT, ja das habe ich gemeint.
Jojo
1
Während dies ist schön und tut Hilfe zu erreichen oder die (wahrscheinlich) gewünschte Wirkung zu unterstützen, dies nicht Redirect HTTP - Anfragen auf https, und als solche keine Antwort auf die Frage. Dies funktioniert nur, wenn der Client bereits über HTTPS auf die Site zugegriffen hat (innerhalb des angegebenen maximalen Altersintervalls). Daher sollte immer eine ordnungsgemäße Weiterleitung erfolgen.
Nicolai Ehemann
4

Fügen Sie diesen Code in Ihre .htaccess-Datei ein. Und es sollte funktionieren

RewriteCond %{HTTP_HOST} yourDomainName\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://yourDomainName.com/$1 [R,L]
Pallavi
quelle
2

Fügen Sie diesen Code am Ende Ihrer .htaccess-Datei hinzu

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Muthu Kumaran
quelle
1
Wahrscheinlich, weil mod_rewrite in dieser Antwort nicht wie in anderen aktiviert ist.
Keji
Wenn Sie nur oben hinzufügen RewriteEngine on, funktioniert es.
Giacomo1968
2

Fügen Sie Folgendes oben im .htaccess hinzu

RewriteEngine On
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
user2486706
quelle
1

Ich hatte auch ein Problem mit der Umleitung. Ich habe alles versucht, was auf Stackoverflow vorgeschlagen wurde. Der einzige Fall, den ich selbst gefunden habe, ist:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP:SSL} !=1 [NC]
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Verweigert Zaiats
quelle
1

Dadurch wird sichergestellt, dass Weiterleitungen für alle Kombinationen intransparenter Proxys funktionieren.

Dies schließt den Webserver des Fallclients <http> Proxy <https> ein .

# behind proxy
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^http$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# plain
RewriteCond %{HTTP:X-FORWARDED-PROTO} ^$
RewriteCond %{REQUEST_SCHEME} ^http$ [NC,OR]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]
Jonas Eberle
quelle
-1

Erzwingen von HTTPS mit der .htaccessDatei

==> Leiten Sie den gesamten Webverkehr um: -

Fügen Sie die folgenden Codezeilen in die .htaccessDatei im Stammordner Ihrer Website ein , um den gesamten Webverkehr zur Verwendung von HTTPS zu zwingen .

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

==> Nur angegebene Domäne umleiten: -

Verwenden Sie die folgenden Codezeilen in der .htaccessDatei im Stammordner Ihrer Website, um eine bestimmte Domain zur Verwendung von HTTPS zu zwingen :

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Wenn dies nicht funktioniert, entfernen Sie die ersten beiden Zeilen.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]

Stellen Sie sicher, dass Sie example.com durch den Domainnamen ersetzen, den Sie für https erzwingen möchten. Darüber hinaus müssen Sie www.example.com durch Ihren tatsächlichen Domainnamen ersetzen.

==> Angegebenen Ordner umleiten: -

Wenn Sie SSL für einen bestimmten Ordner erzwingen möchten, fügen Sie den folgenden Code in eine .htaccessDatei ein, die sich in diesem bestimmten Ordner befindet:

RewriteCond %{REQUEST_URI} !^/[0-9]+\..+\.cpaneldcv$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} folder
RewriteRule ^(.*)$ https://www.example.com/folder/$1 [R=301,L]

Stellen Sie sicher, dass Sie den Ordnerverweis auf den tatsächlichen Ordnernamen ändern. Stellen Sie dann sicher, dass Sie www.example.com/folder durch Ihren tatsächlichen Domainnamen und Ordner ersetzen, für den Sie das SSL erzwingen möchten.

Vishal Thakur
quelle
-1

Ersetzen Sie Ihre Domain durch domainname.com, es funktioniert mit mir.

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domainname\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.domainname.com/$1 [R,L]
Abd Abughazaleh
quelle
2
Bitte posten Sie nicht nur Code als Antwort, sondern geben Sie auch eine Erklärung, was Ihr Code tut und wie er das Problem der Frage löst. Antworten mit einer Erklärung sind in der Regel hilfreicher und von besserer Qualität und ziehen eher positive Stimmen an.
Mark Rotteveel