Wie kann ich mithilfe der in PHP spezifischen Seite .htaccess und mod_rewrite SSL / https erzwingen?
Für Apache können Sie mod_ssl
SSL erzwingen mit SSLRequireSSL Directive
:
Diese Anweisung verbietet den Zugriff, es sei denn, HTTP über SSL (dh HTTPS) ist für die aktuelle Verbindung aktiviert. Dies ist sehr praktisch im SSL-fähigen virtuellen Host oder in den Verzeichnissen, um sich gegen Konfigurationsfehler zu schützen, die Dinge offenlegen, die geschützt werden sollten. Wenn diese Anweisung vorhanden ist, werden alle Anforderungen abgelehnt, die kein SSL verwenden.
Dies führt jedoch keine Umleitung 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 unter
Sie können dies auch in PHP lösen, falls Ihr Provider .htaccess deaktiviert hat (was unwahrscheinlich ist, da Sie danach gefragt haben, aber trotzdem).
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();
}
}
%{HTTP:X-Forwarded-Proto}
oder%{HTTP:X-Real-Port}
Variablen zu prüfen , ob SSL aktiviert ist.RewriteRule <input-pattern> <output-url>
. Daher muss der Speicherplatz vorhanden sein, und die Single^
sagt nur "Alle Eingabe-URLs abgleichen".Ich habe eine
mod_rewrite
Lösung gefunden, die sowohl für Proxyserver als auch für nicht Proxyserver gut funktioniert.Wenn Sie CloudFlare, AWS Elastic Load Balancing, Heroku, OpenShift oder eine andere Cloud / PaaS-Lösung verwenden und Umleitungsschleifen mit normalen HTTPS-Umleitungen auftreten, versuchen Sie stattdessen das folgende Snippet.
quelle
PHP-Lösung
In Anlehnung an Gordons sehr umfassende Antwort stelle ich fest, dass in Ihrer Frage erwähnt wird, dass das Erzwingen von HTTPS / SSL-Verbindungen seitenspezifisch ist.
Ganz oben auf diesen Seiten, die Sie über PHP verbinden möchten, können Sie
require()
eine zentralisierte Datei mit dieser (und allen anderen) benutzerdefinierten Funktionen erstellen und die Funktion dann einfach ausführenforceHTTPS()
.HTACCESS / mod_rewrite-Lösung
Ich habe diese Art von Lösung nicht persönlich implementiert (ich habe der Einfachheit halber eher die PHP-Lösung wie die oben genannte verwendet), aber das Folgende kann zumindest ein guter Anfang sein.
quelle
RewriteCond %{REQUEST_METHOD} !^POST$
?RewriteCond %{REQUEST_METHOD} !^POST$
sollte verhindern, dass POST- Übermittlungen von diesen Umleitungen betroffen sind.Mod-rewrite-basierte Lösung:
Wenn Sie den folgenden Code in htaccess verwenden, werden alle http-Anforderungen automatisch an https weitergeleitet.
Dadurch werden Ihre Nicht-www- und www- http-Anforderungen an die www- Version von https umgeleitet .
Eine andere Lösung (Apache 2.4 *)
Dies funktioniert nicht bei niedrigeren Versionen von Apache, da die Variable% {REQUEST_SCHEME} seit 2.4 zu mod-rewrite hinzugefügt wurde.
quelle
Ich möchte nur darauf hinweisen, dass Apache die schlechtesten Vererbungsregeln hat, wenn mehrere .htaccess-Dateien über Verzeichnis-Tiefen hinweg verwendet werden. Zwei wichtige Fallstricke:
RewriteOptions InheritDownBefore
Direktive (oder eine ähnliche) angeben , um dies zu ändern. (siehe Frage)Das heißt , die vorgeschlagene globale Lösung auf dem Apache - Wiki hat nicht funktioniert , wenn Sie irgendwelche andere .htaccess - Dateien in Unterverzeichnissen verwendet werden . Ich habe eine modifizierte Version geschrieben, die Folgendes tut:
quelle
Einfach und leicht, fügen Sie einfach Folgendes hinzu
quelle
Dieser Code funktioniert für mich
quelle
Einfache Sache :
Ersetzen Sie Ihre URL durch example.com
quelle
Sie können SSL nur mit Apache .htaccess erzwingen
Für die Weiterleitung ist die obige Antwort korrekt
quelle
Versuchen Sie diesen Code, es wird für alle Versionen von URLs wie funktionieren
http://www.website.com
quelle