WordPressとCloudFront連携時のリダイレクトループ解決方法

WordPressの前段にCloudFrontを置くと色々便利ですよね。キャッシュされて毎回記事生成されなくなることでレスポンスタイムがはやくなったり、オリジンサーバにアクセスが来なくなるのでスループットがほぼ無限大になったり(お金も無限大にかかる)

ということでWordPressとCloudFrontを連携させたものの、リダイレクトループが発生してしまいました。

下記のようなサイトを見て対策してみたものの、解決せず・・・。今回は下記サイトとは別の方法で解決した内容を書きたいと思います。

 

sys-guard.com

 

スポンサーリンク

 

解決策

解決策1(綺麗)

 上記サイトの設定をせずに、Forward HeadersをWhitelistに、WhitelistHeaderにHostを追加します。

 

f:id:viaggiolog:20170306200713p:plain

解決策2(強引)

wp-config.phpに下記の通りの設定を行う。example.comは各自のCloudFront側のURLです。

$_SERVER['HTTP_HOST'] = 'example.com';
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

 

リダイレクトループが発生する理由

オリジンサーバのホスト名がorigin.example.com、CloudFront側のホスト名がexample.comである場合を考えてみます。

HTTPリクエストヘッダにhostヘッダというものがあり、WhitelistにHostを設定するかどうかで下記の通り動作が変わります。

WhitelistにHostが設定されていない場合

クライアントからCloudFrontまではHostにexample.comが設定されます。CloudFrontからWordPressまでのアクセスはorigin.example.comが設定されます。

WordPressでは自分のホスト名をHostヘッダによって判断しています。

そのため、WordPressはorigin.example.comにアクセスされたと勘違いし、example.comにリダイレクトを行います。しかし、example.comにアクセスすると、もう一度example.comにリダイレクトされてしまいます。

f:id:viaggiolog:20170306210348p:plain

WhitelistにHostが設定されている場合

CloudFrontはクライアントから送られてきたHostをそのままオリジンサーバに転送します。そのため、リダイレクトループは発生しません。

f:id:viaggiolog:20170306210408p:plain

Hostヘッダを転送することによる影響

VirtualHostもHostヘッダによってホスト名を判断しているため、CloudFrontとオリジンサーバ間をhttps通信したい場合、example.comのVirtualHostにorigin.example.comの証明書を設定する必要があります。

なんだか気持ち悪かったので私は強引に解決策2を実施してしまいました。

下記設定はWordPress(PHP)が認識するHOSTヘッダを強引にexample.comに書き換えル設定になっています。

$_SERVER['HTTP_HOST'] = 'example.com';
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];