it-swarm.com.de

Erzwinge SSL / https mit .htaccess und mod_rewrite

Wie kann ich SSL/https erzwingen, indem ich .htaccess- und mod_rewrite-spezifische Seiten in PHP verwende?.

224
Sanjay Shah

Für Apache können Sie mod_ssl verwenden, um SSL mit SSLRequireSSL Directive zu erzwingen:

Diese Anweisung verbietet den Zugriff, es sei denn, HTTP über SSL (d. H. HTTPS) ist für die aktuelle Verbindung aktiviert. Dies ist sehr praktisch im SSL-aktivierten virtuellen Host oder in den Verzeichnissen, um Konfigurationsfehler zu vermeiden, die zu schützende Elemente offenlegen. Wenn diese Anweisung vorhanden ist, werden alle Anforderungen abgelehnt, die kein SSL verwenden.

Dies führt jedoch keine Weiterleitung zu https durch. Versuchen Sie zum Umleiten Folgendes mit mod_rewrite in Ihrer .htaccess-Datei

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

oder einer der verschiedenen Ansätze bei

Sie können dies auch in PHP für den Fall, dass Ihr Provider .htaccess deaktiviert hat (was jedoch unwahrscheinlich ist, da Sie danach gefragt haben) lösen.

if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
    if(!headers_sent()) {
        header("Status: 301 Moved Permanently");
        header(sprintf(
            'Location: https://%s%s',
            $_SERVER['HTTP_Host'],
            $_SERVER['REQUEST_URI']
        ));
        exit();
    }
}
420
Gordon

Ich habe einen ... gefunden mod_rewrite Lösung, die sowohl für Proxy-Server als auch für nicht-Proxy-Server gut funktioniert.

Wenn Sie CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift oder eine andere Cloud/PaaS-Lösung verwenden und mleitungsschleifen mit normalen HTTPS-Umleitungen auftreten, versuchen Sie Folgendes: stattdessen.

RewriteEngine On

# If we receive a forwarded http request from a proxy...
RewriteCond %{HTTP:X-Forwarded-Proto} =http [OR]

# ...or just a plain old http request directly from the client
RewriteCond %{HTTP:X-Forwarded-Proto} =""
RewriteCond %{HTTPS} !=on

# Redirect to https version
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
50
raphinesse

PHP-Lösung

In Anlehnung an Gordons sehr umfassende Antwort stelle ich fest, dass in Ihrer Frage die Erzwingung von HTTPS/SSL-Verbindungen als seitenabhängig bezeichnet wird.

function forceHTTPS(){
  $httpsURL = 'https://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
  if( count( $_POST )>0 )
    die( 'Page should be accessed with HTTPS, but a POST Submission has been sent here. Adjust the form to point to '.$httpsURL );
  if( !isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS']!=='on' ){
    if( !headers_sent() ){
      header( "Status: 301 Moved Permanently" );
      header( "Location: $httpsURL" );
      exit();
    }else{
      die( '<script type="javascript">document.location.href="'.$httpsURL.'";</script>' );
    }
  }
}

Ganz oben auf diesen Seiten, die Sie zum Herstellen einer Verbindung über PHP zwingen möchten, können Sie dann eine zentralisierte Datei mit dieser (und allen anderen) benutzerdefinierten Funktionen require() und anschließend einfach die Funktion forceHTTPS() Funktion.

HTACCESS/mod_rewrite Lösung

Ich habe diese Art von Lösung nicht persönlich implementiert (ich habe dazu tendiert, die PHP Lösung wie die oben aus Gründen der Einfachheit) zu verwenden), aber das Folgende könnte zumindest ein guter Anfang sein .

RewriteEngine on

# Check for POST Submission
RewriteCond %{REQUEST_METHOD} !^POST$

# Forcing HTTPS
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{SERVER_PORT} 80
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_secure [OR]
RewriteCond %{REQUEST_URI} ^something_else_secure
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Forcing HTTP
RewriteCond %{HTTPS} =on [OR]
RewriteCond %{SERVER_PORT} 443
# Pages to Apply
RewriteCond %{REQUEST_URI} ^something_public [OR]
RewriteCond %{REQUEST_URI} ^something_else_public
RewriteRule .* http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
36
Luke Stevenson

Mod-Rewrite-basierte Lösung:

Wenn Sie in htaccess den folgenden Code verwenden, werden alle http-Anforderungen automatisch an https weitergeleitet.

RewriteEngine on

RewriteCond %{HTTPS}::%{HTTP_Host} ^off::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

Dadurch werden Ihre nicht www und www http-Anforderungen an www Version von https umgeleitet.

Eine andere Lösung (Apache 2.4 *)

RewriteEngine on

RewriteCond %{REQUEST_SCHEME}::%{HTTP_Host} ^http::(?:www\.)?(.+)$
RewriteRule ^ https://www.%1%{REQUEST_URI} [NE,L,R]

Dies funktioniert bei niedrigeren Versionen von Apache nicht, da die Variable% {REQUEST_SCHEME} seit 2.4 zu mod-rewrite hinzugefügt wurde.

10
starkeen

Ich möchte nur darauf hinweisen, dass Apache das Schlimmste Vererbungsregeln hat, wenn Sie mehrere .htaccess-Dateien in verschiedenen Verzeichnissen verwenden. Zwei wichtige Fallstricke:

  • Standardmäßig werden nur die Regeln ausgeführt, die in der tiefsten .htaccess-Datei enthalten sind. Sie müssen das RewriteOptions InheritDownBefore Direktive (oder ähnlich), um dies zu ändern. (siehe Frage)
  • Das Muster wird auf den Dateipfad relativ zum Unterverzeichnis angewendet und nicht auf das übergeordnete Verzeichnis, das die .htaccess-Datei mit der angegebenen Regel enthält. (siehe Diskussion)

Dies bedeutet, dass die vorgeschlagene globale Lösung im Apache Wiki nicht funktioniert, wenn Sie andere .htaccess-Dateien in Unterverzeichnissen verwenden. Ich habe eine modifizierte Version geschrieben, die Folgendes tut:

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteOptions InheritDownBefore
# This prevents the rule from being overrided by .htaccess files in subdirectories.

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [QSA,R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
7
lpd

Dieser Code funktioniert für mich

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_Host}/$1 [R=301,L]
0
Alexufo

Einfach und leicht, fügen Sie einfach Folgendes hinzu

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
0
Saurabh Mistry

Keine der anderen Antworten hat für mich funktioniert. Mein Setup ist eine PHP App auf AWS Beanstalk mit einem klassischen ELB. Der .htaccess-Ansatz würde nicht funktionieren, daher musste ich die Weiterleitungsregeln auf die Apache-Datei httpd.conf anwenden. ZB (von AWS) docs):

Apache-Server: virtuelle Host-Dateimethode (empfohlen)

  1. Öffnen Sie Ihre Apache-Konfigurationsdatei. Mögliche Speicherorte sind /etc/httpd/conf/httpd.conf (Apache 2/httpd),/etc/Apache2/sites-enabled/(Apache 2.4) oder /etc/Apache2/Apache2.conf (Apache unter Ubuntu).

  2. Fügen Sie dem VirtualHost-Abschnitt Ihrer Konfigurationsdatei eine Umschreiberegel hinzu, die der folgenden ähnelt.

    RewriteEngine On RewriteCond% {HTTP: X-Forwarded-Proto} = http RewriteRule. * https: //% {HTTP: Host}% {REQUEST_URI} [L, R = permanent]

  3. Speichern Sie Ihre Apache-Konfigurationsdatei

  4. Starten Sie Apache neu

Siehe hier: https://www.youtube.com/watch?v=hvqZV_50GlQ

https://aws.Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb/

0
Risteard