2017年7月26日水曜日

wordpressをElastic Beanstalkもしくはelbでスケーリングさせようとするときに、httpsでwp-adminにアクセスしようとするとリダイレクトループになってしまう的なお話

  • このエントリーをはてなブックマークに追加

タイトル通りで、httpsでオートスケーリングするときに、wp-adminがリダイレクトループしてしまう。
ついでにいうとテンプレートディレクトリのURLもhttpsじゃなくてhttpになってしまう。
原因としてはオートスケーリングのためのロードバランサーの仕組みだったりするわけで。

なので今日はそれを解決するためのお話をば。

wordpressはhttpsでアクセスされたときに、$_SERVER['HTTPS']を見てhttpsかどうかを判断する。
$_SERVER['HTTPS'] = 1になる条件としては、そのサーバに対してポート443でアクセスしたときだけだったりする。
けどそれだったらhttpsだしっていう話になりそうなんだけど、
ロードバランサーを使うと、ロードバランサーまでは443だけど、ロードバランサーからサーバまでは80で繋がっているという感じ。
wordpressが置いてあるサーバには80でアクセスしていることになるので、$_SERVER['HTTPS'] = 0ということになってしまう。

ということでこれは困るので、これを解決するためには、wp-configに下記のものを書く必要がある。

/* 認証用ユニークキーの上あたり */
define('FORCE_SSL_LOGIN', true);
if(!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https'){
  $_SERVER['HTTPS']='on';
}

/**#@+
 * 認証用ユニークキー
 *
 * それぞれを異なるユニーク (一意) な文字列に変更してください。
 * {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org の秘密鍵サービス} で自動生成することもできます。
 * 後でいつでも変更して、既存のすべての cookie を無効にできます。これにより、すべてのユーザーを強制的に再ログインさせることになります。
 *
 * @since 2.6.0
 */

ってな感じ。
ロードバランサーからサーバにアクセスする際に、$_SERVER['HTTP_X_FORWARDED_PROTO']というのがつくので、それを見てonにしましょう的な。
ちなみにdefine('FORCE_SSL_LOGIN', true)はwp-adminに接続するときは、強制的にHTTPSにするよ的な感じ。

ってな感じでやってあげれば解決できる的な。
もちろんDBのwp_optionのsiteurlとhomeもhttpsにしないとダメだよ的な。

Adsense