$ _SERVER ['HTTPS'] = 'on'を設定すると、wp-adminへのアクセスが禁止されます


16

まず、私のサーバーはロードバランサーの後ろに座っています。SSL証明書はロードバランサーに置かれ、HTTPSを処理します。ポート443で受信したデータは、ポート80でHTTPを使用してWordpressサーバーに転送されます。

ただし、wordpressとphpはサーバー構成を認識しません。これにより、ブラウザーは有効なSSL証明書の有効性について疑わしくなります。

これを修正するために、functions.phpに次のコードを追加しました。ここでこのコードを見つけましたが、コーデックスは同意します。

/**
 * 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';
}

これはフロントエンドではうまく機能しますが、管理者アカウントでも/ wp-admin /にアクセスできなくなります。ログインすると、「申し訳ありませんが、このページへのアクセスは許可されていません。」というメッセージが表示されます。他のヘルプは提供されていません。

そこで、wp-adminフォルダーを検索したところ、「申し訳ありませんが、このページへのアクセスは許可されていません。」という言葉が見つかりました。17回表示されます。

これらのエラーメッセージのほとんどは、ユーザーのアクセス許可チェックに関連付けられています。

HTTPSを「オン」に保ち、管理者アクセスを保持するにはどうすればよいですか?

概要:

  • functions.phpにHTTP_X_FORWARDED_PROTOロジックを追加する前に、wp-admin /にアクセスできます
  • functions.phpにHTTP_X_FORWARDED_PROTOロジックを追加した後、wp-admin /にアクセスできません
  • functions.phpからHTTP_X_FORWARDED_PROTOロジックを削除した後、wp-admin /にアクセスできません

更新:

エラーメッセージはwp-admin / menu.phpから来ており、このコードの塊が下部にあることを発見しました。menu.phpエラーの最後に追加して、このファイルであることがわかりました。

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 );
}

私はまだこれを修正する方法を理解していません。


1
構成の残りの部分について多くを語ってはいけません。あなたは、設定しましたdefine('FORCE_SSL_ADMIN', true);
user42826

「FORCE_SSL_ADMIN」を定義しませんでした。やってみます。
nu everest

https Cookieもロードバランサーからhttp経由で送信されることを確認する必要があります。送信されていないようです。明らかにもチェックする必要が周りに他の方法に、あなたが設定することをクッキーは、HTTPSを介して転送されている
マークKaplun

回答:


19

user42826に感謝します。

コーデックスによると:

WordPressがSSLを提供するリバースプロキシの背後でホストされているが、SSLなしでホストされている場合、これらのオプションは最初にリクエストを無限リダイレクトループに送信します。これを回避するには、HTTP_X_FORWARDED_PROTOヘッダーを認識するようにWordPressを設定します(そのヘッダーを設定するためにリバースプロキシを適切に設定したと仮定します)。

次のアクションは問題を解決します。

これをwp-config.phpに追加します。(コーデックスリファレンス

/* 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';
}

これは必要ないため、functions.phpから削除します。

/**
 * 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';
}

1
その理由は、LBがSSLを実行しているがバックエンドは単純なhttpであるため、ロードバランサーの背後でセキュアセッションCookieが失われるためです。エンタープライズレベルのアーキテクチャで作業している他の人を見るのは
嬉しい

@ user42826この設定の利点は、管理者アクセスを禁止したい場合にFORCE_SSL_ADMINをコメントアウトできること、またはこの考え方を再考する必要がある他の副作用がありますか?
nu everest

1
セットアップでは、FORCE_SSL_ADMINを設定しないと管理者アクセスが禁止されているように聞こえますが、要件に応じてより適切な方法があります。例:.htaccessまたはapache configでwp-adminまたはwp-login.phpアクセスを禁止し、プラグインを介してWPネイティブ認証を削除し、wp-admin URLがパブリックURLと異なるようにWPを再構築します
user42826

6
require_once(ABSPATH . 'wp-settings.php');行の前にこのコードを追加してください。この回答のjtlに感謝します。
アアロニヌス

@Aaroninusありがとう、私はCloudflareフレキシブルSSLを使用しています。あなたのコメントがなければ、再び検索に時間を費やしていたでしょう。私は以前にこの関連する質問が見つかりました:wordpress.stackexchange.com/questions/170165/...
baptx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.