Das Setzen von $ _SERVER ['HTTPS'] = 'on' verhindert den Zugriff auf wp-admin

16

Zunächst sitzt mein Server hinter einem Load Balancer. Mein SSL-Zertifikat befindet sich auf dem Load Balancer und verarbeitet HTTPS. Die an Port 443 eingehenden Daten werden über HTTP an Port 80 an den Wordpress-Server weitergeleitet.

Allerdings kennen WordPress und PHP meine Serverkonfiguration nicht. Dies führt dazu, dass der Browser hinsichtlich der Gültigkeit meines gültigen SSL-Zertifikats misstrauisch wird.

Um dieses Problem zu beheben, habe ich die Datei functions.php um den folgenden Code erweitert. Ich habe diesen Code hier gefunden und der Codex stimmt zu .

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}

Dies funktioniert hervorragend für das Frontend, aber jetzt ist der Zugriff auf / wp-admin / auch mit meinem Admin-Konto nicht möglich. Nach dem Anmelden erhalte ich die Nachricht "Entschuldigung, Sie dürfen nicht auf diese Seite zugreifen." Es wird keine andere Hilfe bereitgestellt.

Also habe ich den Ordner wp-admin durchsucht und festgestellt, dass die Wörter "Entschuldigung, Sie dürfen nicht auf diese Seite zugreifen." erscheinen 17 verschiedene Male.

Die meisten dieser Fehlermeldungen sind mit einer Überprüfung der Benutzerberechtigungen verbunden.

Wie lasse ich HTTPS aktiviert und behalte den Administratorzugriff?

Zusammenfassung:

  • Bevor ich die HTTP_X_FORWARDED_PROTO-Logik zu functions.php hinzufüge, kann ich auf wp-admin / zugreifen.
  • Nach dem Hinzufügen der HTTP_X_FORWARDED_PROTO-Logik zu functions.php kann ich nicht auf wp-admin / zugreifen.
  • Nach dem Entfernen der HTTP_X_FORWARDED_PROTO-Logik zu functions.php kann ich nicht auf wp-admin / zugreifen.

AKTUALISIEREN:

Ich habe festgestellt, dass die Fehlermeldung von wp-admin / menu.php und diesem Codestück unten kommt. Ich menu.phphabe am Ende des Fehlers hinzugefügt , um herauszufinden, dass es sich um diese Datei handelt.

if ( !user_can_access_admin_page() ) {

    /**
     * Fires when access to an admin page is denied.
     *
     * @since 2.5.0
     */
    do_action( 'admin_page_access_denied' );

    wp_die( __( 'Sorry, you are not allowed to access this page. menu.php'), 403 );
}

Ich verstehe immer noch nicht, wie ich das beheben kann.

nu everest
quelle
1
Sie sagen nicht viel über den Rest Ihrer Konfiguration. Hast du eingestelltdefine('FORCE_SSL_ADMIN', true);
user42826
Ich habe 'FORCE_SSL_ADMIN' nicht definiert. Ich werde es versuchen.
Nu Everest
Sie müssen überprüfen, ob die https-Cookies auch vom Load Balancer über http gesendet werden. Es klingt wie sie nicht gesendet werden. Natürlich muss auch umgekehrt geprüft werden, ob die von Ihnen gesetzten Cookies über https
Mark Kaplun,

Antworten:

19

Besonderer Dank geht an user42826.

Nach dem Kodex:

Wenn WordPress hinter einem Reverse-Proxy gehostet wird, der SSL bereitstellt, jedoch selbst ohne SSL gehostet wird, senden diese Optionen zunächst alle Anforderungen an eine Endlosumleitungsschleife. Um dies zu vermeiden, können Sie WordPress so konfigurieren, dass der HTTP_X_FORWARDED_PROTO-Header erkannt wird (vorausgesetzt, Sie haben den Reverse-Proxy richtig konfiguriert, um diesen Header festzulegen).

Die folgenden Aktionen lösen das Problem.

Fügen Sie dies zu wp-config.php hinzu. ( Codex-Referenz )

/* SSL Settings */
define('FORCE_SSL_ADMIN', true);

/* Turn HTTPS 'on' if HTTP_X_FORWARDED_PROTO matches 'https' */
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false) {
    $_SERVER['HTTPS'] = 'on';
}

Entfernen Sie dies aus functions.php, da es nicht notwendig ist.

/**
 * Make PHP HTTPS aware via HTTP_X_FORWARDED_PROTO
 */
if(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS']='on';
}
nu everest
quelle
1
Der Grund dafür ist, dass sichere Sitzungscookies hinter dem Load Balancer verloren gehen, weil LB SSL ausführt, das Backend jedoch nur http ist. Schön zu sehen, dass andere an Architekturen auf Unternehmensebene arbeiten;)
user42826
@ user42826 Das Schöne an diesem Setup ist, dass ich FORCE_SSL_ADMIN nur auskommentieren kann, wenn ich den Administratorzugriff sperren möchte, oder gibt es andere Nebenwirkungen, die mich veranlassen sollten, diese Denkweise zu überdenken?
Nu Everest
1
In Ihrem Setup klingt es so, als würde FORCE_SSL_ADMIN nicht den Administratorzugriff verhindern. Es gibt jedoch je nach Ihren Anforderungen bessere Möglichkeiten, dies zu tun. Beispiele: Verhindern Sie den Zugriff von wp-admin oder wp-login.php in .htaccess oder apache config, entfernen Sie die native WP-Authentifizierung über das Plugin, re-architecture WP, sodass sich die wp-admin-URL von der öffentlichen URL unterscheidet, usw.
user42826
6
Stellen Sie sicher, dass Sie diesen Code vor der require_once(ABSPATH . 'wp-settings.php');Zeile einfügen . Besonderer Dank geht an jtl in dieser Antwort.
Aaroninus
@Aaroninus danke, ich benutze Cloudflare flexible SSL und ohne deinen Kommentar hätte ich nochmal lange gesucht. Ich fand diese verwandte Frage zuvor: wordpress.stackexchange.com/questions/170165/…
baptx