2009-07-10 6 views
19

Wir haben eine Shopping-Site, die wir auf einem freigegebenen Host (Mediatemple Gridserver) hosten. Einige Teile der Website müssen HTTPS (Checkout usw.) verwenden, der Rest sollte jedoch HTTP verwenden.Richtiges Umschalten zwischen HTTP und HTTPS mit .htaccess

Weiß jemand, wie wir immer die korrekte Verwendung von HTTP/HTTPS für bestimmte URLs erzwingen können? Wir haben es in verschiedenen Zuständen laufen lassen, aber wir können keine Anforderung für eine Seite erhalten, die auf HTTP sein sollte, aber mit HTTPS aufgefordert wird, korrekt zurück zu schalten.

Ich habe mich in SO umgesehen, konnte aber keine passende Antwort finden.

+0

Ist es mit .htaccess sein? Welche Sprache die Website? – random

+0

verwendet, ist Was versuchen Sie mit dem https zu verhindern? –

Antwort

33

ich etwas ähnliches wie dies für mein Admin-Ordner in Wordpress:

#redirect all https traffic to http, unless it is pointed at /checkout 
RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/checkout/?.*$ 
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L] 

Der RewriteCond %{HTTPS} on Teil nicht für alle Web-Server arbeiten kann. Mein Webhost benötigt zum Beispiel RewriteCond %{HTTP:X-Forwarded-SSL} on.

Wenn Sie das Gegenteil zwingen wollen, versuchen Sie:

#redirect all http traffic to https, if it is pointed at /checkout 
RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/checkout/?.*$ 
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L] 

Wenn Sie einige alternative Möglichkeiten, es tun möchten, überprüfen askapache.

+0

ich den Code überprüft auf meinem Server, mit beiden oben aufgeführten Blöcken, und es funktioniert gut ohne Umleitungsschleifen. –

+0

+1. Große Antwort. Die RewriteCond% {HTTP: X-Forwarded-SSL} auf wurde in meinem Fall benötigt, weil ich RackSpace Cloud verwende Websites. –

+2

[@ wilmoores] (http://stackoverflow.com/questions/1108706/correctly-switching-between-http-and-https-using-htaccess/#9917579) Vorschlag, '% {SERVER_NAME}' Zusatz zu verwenden, wird nützlich sein – antitoxic

0

denke ich es sein sollte:

RewriteCond %{HTTPS} =on 
^/checkout(.*) http://shoppingsite.com/checkout$1 [R] 

Siehe mod_rewrite Dokumentation.

13

Dies sollte so ziemlich jedes Szenario arbeiten und sollte in Ihrem tatsächlichen vHost oder .htaccess arbeiten:

RewriteEngine on 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

(vergessen Sie nicht, den Schrägstrich vor% {REQUEST_URI}, da dies ermöglichen kann eine Port-Nummer vorbei, die ist gefährlich)

+1

Ihre Antwort, während elegant, hat einen kleinen Fehler. Die letzte Zeile sollte nach SERVER_NAME einen Schrägstrich (/) haben, oder www.test.com/dir leitet zu http://www.test.comdir – Juhani

+0

@Juhani Danke für Ihren Kommentar. Tatsächlich wird% 1 der Umgebungsvariablen {REQUEST_URI} zugeordnet, die Root-relativ ist. Mit anderen Worten, wenn Sie http://example.com/123 angefordert haben, dann REQUEST_URI === '/ 123'; daher wäre ein weiterer Schrägstrich überflüssig. Es würde immer noch funktionieren, denn in den meisten modernen Konfigurationen wird Apache den zusätzlichen Schrägstrich entfernen. Wenn Sie nicht möchten, dass Apache mehr Arbeit macht, brauchen Sie keinen Schrägstrich. Davon abgesehen, habe ich meine ursprüngliche Antwort aktualisiert, um% {REQUEST_URI} anstelle von% 1 zu verwenden, da dies eher aufschlussreich ist. –

+0

@wilmoore: das ist korrekt, wenn die Optionen in der Server-Konfigurationsdatei abgelegt werden, da die Rewrite-Engine [hook] (http://httpd.apache.org/docs/2.4/rewrite/tech.html) URL-to- Dateinamen-Übersetzung. Wenn sie jedoch in einer Konfigurationsdatei [per-Verzeichnis] ​​(http://httpd.apache.org/docs/2.4/rewrite/intro.html#htaccess) platziert wurde, wurde der URI bereits zu dem Zeitpunkt dem Pfadnamen zugeordnet Rewrite Engine tritt ein. Die Rewrite-Engine handhabt dies, indem sie das Verzeichnis-Präfix entfernt, wodurch das führende '/' entfernt und mit dem Ergebnis verglichen wird. – outis

1

Wie in this answer beschrieben, reparieren Sie Ihre Anwendung zu verwenden https:// Links bei Bedarf. Verlassen Sie sich nicht auf automatische Weiterleitungen, dies könnte zu einem falschen Sicherheitsgefühl führen, wenn Sie Ihre Links/Formulare nicht über die URLs https:// an https:// weitergeleitet haben. Die Verwendung von mod_rewrite macht es automatisch schwieriger, solche Fehler zu erkennen (was auch Schwachstellen sein können).

5
RewriteEngine on 
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L] 

Ich hatte einige Probleme hinter einem loadballancer zu sein. So wie ich es repariert habe.

+0

Funktioniert das tatsächlich? Es warf mich in eine Umleitungsschleife. Wenn Sie loadbalancer haben, wird der HTTPS nicht gesetzt und der erste RewriteCond wird erfüllt. Wenn nicht, wird der zweite RewriteCond erfüllt. Somit werden Sie jedes Mal wieder umgeleitet. Ich habe es funktioniert mit (eine andere Antwort) [http://stackoverflow.com/a/26623196/2182900] das ist im Grunde die gleiche Sache, aber ohne die '[OR]' - Sie nur umleiten, wenn sowohl HTTPS ausgeschaltet ist und die HTTP : X-Forwarded-Proto ist kein https. –

+0

Das funktioniert perfekt für mich. Vielen Dank! –

1

Für mich funktionierte dies (ich verwendete es für Wordpress-Site und Umleitung zu HTTPS). Sie haben den Zustand und die Regelzeilen direkt hinter RewriteEngine und RewriteBase Zeilen hinzuzufügen:

# BEGIN WordPress 
<IfModule mod_rewrite.c> 
RewriteEngine On 
RewriteBase/

# I added these two lines for redirect to HTTPS 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L] 
# (end of custom modifications) 

RewriteRule ^index\.php$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule . /index.php [L] 
</IfModule> 
# END WordPress` 

Werfen Sie einen Blick RewriteCond %{HTTP:X-Forwarded-Proto} !https aufzubereiten - nur das für meine Server-Hosting gearbeitet. (Ich habe versucht RewriteCond %{SERVER_PORT} !^443$ oder RewriteCond %{HTTPS} off als gut, aber ohne Erfolg.

Verwandte Themen