WordPressのログイン画面で無限302ループ

http302_wordpress-001

先日、WordPressをひっさびさに、実に3年ぶりくらいに構築しておりました。
その際、管理画面にログインしようとすると、必ずタイムアウトしてしまい、なんで? と思ってログを見ていたら無限302(HTTPのステータスコード302 Found)のループにハマっていたのでエントリ。

原因

さきに結論から書くと、フロントのNginxはHTTPSで受け付けていてリバースプロキシにしており、WordPressを上げているサーバ(Proxyフォワード先)のサーバはHTTPでListenしていたのが問題だった。

クライアント ⇔(https)⇔ リバプロサーバ ⇔(http)⇔ WordPressサーバ

なんでこんな構成にしたかというと、単純にWordPressを上げてるサーバに証明書とか入れるのめんどうだったからっていう、しょうもない理由で・・
まず、WordPress側も(nginxなり、Apacheなり)HTTPSで受け付ければたぶん治ると思います

どうしてもリバースプロキシからはHTTPで受けたい場合

ほぼ、そんなケースないと思うんですがリバースプロキシの後ろで443を開けれないとか、何かしら強引にHTTPで受け付けたい場合のやり方がドキュメントにありました。

wp-includes/default-constants.php を修正する

けど、このソース修正したりしたとしてもWordPressのバージョンアップで入れ替わったりしないのかな・・
恒久的な対策にはならないかもしれませんが、一応メモ。

default-constans.php の中に

function wp_ssl_constants(){
   (略)
}

がありますが、この中で

force_ssl_admin( FORCE_SSL_ADMIN );
と、
force_ssl_admin( true )

と書いてある箇所があって、
(リバプロはHTTPSで受けてるけど)ホストしてるサーバがHTTPでリクエスト受けてる場合は
このforce_ssl_admin() 関数がhttps://hogehoge でログインさせるようロケーションヘッダを返却してしまうようです。

その辺は、ここによくかいてあります。→ 管理画面でのSSL通信

てなわけで、wpdocsに書いてあるとおり

 if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {$_SERVER['HTTPS']='on';}

を追加してみたら、無事サーバの通信をHTTPSにしなくても一応ログインはできました。

最終的に下記の様にした

/**
 * Defines cookie related WordPress constants
 *
 * @since 3.0.0
 */
function wp_ssl_constants() {
        /**
         * @since 2.6.0
         */
        if ( !defined( 'FORCE_SSL_ADMIN' ) ) {
                if ( 'https' === parse_url( get_option( 'siteurl' ), PHP_URL_SCHEME ) ) {
                        define( 'FORCE_SSL_ADMIN', true );
                        if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) &&
                                      $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
                            $_SERVER['HTTPS']='on';
                        }
                } else {
                        define( 'FORCE_SSL_ADMIN', false );
                }
        }
        force_ssl_admin( FORCE_SSL_ADMIN );

        /**
         * @since 2.6.0
         * @deprecated 4.0.0
         */
        if ( defined( 'FORCE_SSL_LOGIN' ) && FORCE_SSL_LOGIN ) {
                force_ssl_admin( true );
        }
}

けど、あくまで暫定対応だと思う〜〜

おわり

 

2016-09-12 | Posted in Word PressNo Comments » 


関連記事

Comment





Comment



*