CakePHPでロードバランサ配下のサーバでHTTPSのリクエストが正常に判断されない問題

DSC00422

2014年02月20日(木)

こんにちは。先日はとち狂った記事を書いてしまいましたが、また本来の技術系記事にもどります。

 

AWSでロードバランサ(ELB)を構築してその配下にWEBサーバを置く場合によくあるパターンです。

AWSでロードバランサにSSL証明書を設置してWEBサーバへはHTTPでリクエストを流すというのが一般的な構成だと思いますが、この時にアプリケーション側はHTTPでアクセスされているのでベースとなるURLがHTTPになってしまう現象に陥ってしまいました。

その際の対処方法になります。

 

陥る構成例

おそらくこの構成であれば以下のような流れになっていると思います。

リクエスト(HTTPS:443)
↓
LB(HTTPS:443→HTTP:80)
↓
WEBサーバ(HTTP:80)

 

この場合WEBサーバへのリクエストはHTTPなので、アプリケーション内でHTTPSのリクエストを判断することができません。その場合は以下のようにしてアプリケーションの定数を書き換えてあげる処理を挟むとうまくいきます。

 

Ver2.4以降の場合

CakePHP2.4以降の場合はこちらで書き換えられます。

// ロードバランサへHTTPSでアクセスされた場合
if ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) && 443 == $_SERVER['HTTP_X_FORWARDED_PORT'] ) {
 // ベースURLをHTTPSに書き直す
 Router::fullbaseUrl( 'https://'.$_SERVER['HTTP_HOST'] );
}

 

Ver2.4未満の場合

こちらは試していないので感ですが、たぶんこういうイメージですかね・・・

// ロードバランサへHTTPSでアクセスされた場合
if ( isset($_SERVER['HTTP_X_FORWARDED_PORT']) && 443 == $_SERVER['HTTP_X_FORWARDED_PORT'] ) {
 // ベースURLをHTTPSに書き直す
 define('FULL_BASE_URL', 'https://'.$_SERVER['HTTP_HOST']);
}


何をやっているかというと、簡単に言うとこの処理によって、

 

アプリケーション内で認識しているベースのURLを書き換える事が出来ます。

 

つまりアプリケーション内であらゆるURL生成ヘルパー等にも影響しますので、HTTPSオンリーの場合には必須で覚えておいた方がいい知識ですね。わざわざHTTPSと直書きしてURLを生成することがないようにしましょう。

 

これをAppController.phpとかに設置しておけばアプリケーション内ではばっちりですね。

まぁ参考までに覚えておこう。

 

 

 

 

スポンサードリンク

運営サービスPR

スポンサードリンク

運営サービスPR