AWS ElasticBeansTalkでのcakePHPのFULL_BASE_URL定数

【環境】

AWS ElasticBeansTalkのPHP 5.3サーバ
LoadBalancerでSSLを設定し、80→80、443→80とした。
cakePHP 1.2 アプリケーション。

【現象】

https://???.elasticbeanstalk.com/blogs/first にアクセス

アクション内で $this->redirect(‘/blogs/second’);

https://???.elasticbeanstalk.com/blogs/second へリダイレクトするはずが、
http://???.elasticbeanstalk.com/blogs/second へリダイレクトしてしまう。

【原因】

レスポンスヘッダを確認すると、
Location: /blogs/second
ではなく、
Location: http://???.elasticbeanstalk.com/blogs/second
であった。
webブラウザからLoadBalancerへ443ポートアクセスしても、LoadBalancer配下のサーバには80ポートアクセスであり、環境変数 HTTPS は設定されない。そのためcakePHPはhttpアクセスと判断し、httpから始まるURLをFULL_BASE_URL定数を定義してしまう。

【対策例1】

cakePHPがFULL_BASE_URL定数を定義してしまう前に、アプリケーションでFULL_BASE_URL定数を定義する。

app/webroot/index.php の
「if (!include(CORE_PATH . ‘cake’ . DS . ‘bootstrap.php’)) {」
より先頭側に次のスクリプトを挿入する。

【対策例2】

.htaccess で、環境変数HTTPS を設定する。アプリケーション内で環境変数HTTPSを参照している全ての箇所でHTTPSと判断させることができる。

SetEnvIf x-forwarded-port  “^443$” HTTPS=on
SetEnvIf x-forwarded-proto “^https$” HTTPS=on