2015-06-08 3 views
30

Ich hatte dieses Problem schon einmal. Beim Ausführen von Wordpress (oder anderen PHP-Skripten) hinter dem EC2 Load Balancer von Amazon bemerken die Skripte nicht, dass sie unter dem https: // - Protokoll ausgeführt werden und Probleme wie endlose Umleitungsschleifen und HTTPS-Warnungen ("Einige Inhalte dazu Seite wird auf nicht sichere Weise angefordert ... ").Wie behebt man Wordpress HTTPS Probleme, wenn hinter einem Amazon Load Balancer?

fand ich hier eine Lösung, aber Wordpress Kern erfordert Modifizierung, die nicht gut für Aktualisierbarkeit ist: https://wordpress.org/support/topic/when-behind-amazon-web-services-elastic-load-balancer-causes-endless-redirect

Gibt es eine Möglichkeit, dies zu beheben, ohne Wordpress Kern zu modifizieren? Ich benutze Apache 2.2.

Antwort

47

Als Link, den Sie vorgeschlagen gab, für Wordpress das Problem in der is_ssl() Funktion liegt, die wie die meisten PHP-Software explizit die $_SERVER['HTTPS'] und $_SERVER['SERVER_PORT'] zu überprüfen, ob die aktuelle Seite in den https zugegriffen wird überprüft: // Kontext.

Wenn Ihre Seite über HTTPS aufgerufen wird, aber der Amazon Load Balancer SSL-Offloading durchführt und Ihren Inhalt tatsächlich auf dem Nicht-SSL-Port 80 anfordert, versteht der Webserver, PHP oder irgendetwas anderes dies nicht Beachten Sie, dass auf sie über https: // zugegriffen wird.

Die Lösung für dieses ist, dass Balancer Amazon ELB sendet die de-facto-Standard X-Forwareded-Proto HTTP-Header, die wir verwenden, um herauszufinden, welches Protokoll kann der Client tatsächlich mit auf der anderen Seite der Last.

Mit Apache 2.2, könnten Sie etwas entlang der Linien von verwenden:

<IfModule mod_setenvif.c> 
    SetEnvIf X-Forwarded-Proto "^https$" HTTPS 
</IfModule> 

Dieses liest einfach die X-Forwared-Proto Header, und wenn es https dann gleich, setzt die HTTPS Umgebungsvariable 1. PHP wird diese Umgebungsvariable sehen, und schließlich wird es $_SERVER['HTTPS'], was 1 entspricht - genau wie es für eine "echte" native SSL-Anfrage wäre.

+1

Funktioniert gut, Sie müssen sicherstellen, dass Sie das Apache2-Modul setenvif aktiviert haben. – MichaelICE

+0

einfach hinzugefügt, um die Apache-Konfiguration (Bild von Bitnami) und es funktioniert. – sebge2

+0

Beachten Sie, dass viele Proxy-Situationen X-Forwarded-Schema auf eine synonyme Weise verwenden. Generell sicher beides einzustellen. – djsadinoff

12

Eine andere Option aus dem wordpress documentation ist dies zu Ihrem wp-config.php hinzu:

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) 
     $_SERVER['HTTPS']='on'; 
+0

Dies ist die Methode, die ich verwendet habe. Irgendeine Idee, wie man Leute zu HTTPS erzwingt, wenn sie auf die Seite über HTTP zugreifen? –

+0

Sie könnten versuchen, 'force_ssl_content (true);' auch zur wp-config.php hinzuzufügen. Normalerweise würde ich das über eine Apache-Rewrite-Regel oder in der Load-Balancer-Konfiguration tun. – zeroimpl

1

Keines der oben die Mixed Content-Fehler für mich leider gelöst. Was jedoch funktionierte, war das Hinzufügen des Protokolls zu den WP_HOME & & WP_SITEURL-Variablen in wp-config.php, z.

define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']); define('WP_SITEURL', WP_HOME);

Danach werden alle URLs in der Quelle begann mit https und alle Mixed Content Fehler verschwunden.

0

Verwenden Sie diese 4-Schritt-Methode, um die Redirect-Loop und gemischte Inhalte Probleme bei der Verwendung von SSL in WordPress zu entfernen. Ersetzen

1) 'http: //' mit '//' in Datenbank - Diese schafft alle die relativen URLs für Bilder und andere Vermögenswerte

2) in wp-config definiert allgemein wp_home und wp_siteurl Variablen.

define('WP_HOME','//'. $_SERVER['SERVER_NAME']); 
define('WP_SITEURL','//'. $_SERVER['SERVER_NAME']); 

3) Wenn Sie Load Balancer verwenden, verwenden Sie 'HTTP_X_FORWARDED_PROTO' Server-Variable-Protokoll, um herauszufinden, verwendet.Um dies zu tun, fügen Sie diese Zeile in wp-config

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) 
$_SERVER['HTTPS']='on'; 

4) Schließlich in .htaccess, benutzen Sie diese Zeile, wenn Sie hinter Loadbalancer sind alle Zugriffe auf https umgeleitet werden.

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

Falls jemand anderes war für die Nginx entspricht dies suchen, ist hier, was Sie tun müssen:

Für Rewrite-Setup sollten Sie Folgendes unter dem server Block hinzu:

if ($http_x_forwarded_proto != 'https') { 
    rewrite^https://$host$request_uri? permanent; 
} 

Und zum Einstellen des HTTPS-Parameters sollten Sie unter dem location ~ \.php$-Block Folgendes hinzufügen:

if ($http_x_forwarded_proto = 'https') { 
    set $fe_https 'on'; 
} 
fastcgi_param HTTPS $fe_https; 

Denken Sie daran, alle anderen fastcgi_param HTTPS Befehl zu entfernen, wenn Sie irgendwelche (ich hatte es in meiner fastcgi_params Datei).

+0

Du hast meinen Hintern in der Produktion gerettet! Prost! –

+0

Gut zu helfen. Prost :) –

Verwandte Themen