ロードバランサにウェブサーバーを配置した場合、ロードバランサからウェブサーバーの通信はHTTPで行うことが多いと思います。
これ自体に問題はないのですが、せっかくブラウザからhttps://でアクセスしても、EC-CUBEはそのままではHTTPS通信を認識することができません。
HTTPSかどうかを判断するサーバー変数が通常と同じ方法では取得できなくなるためです。
EC-CUBEがSSLを認識できないと、次のような不具合が発生します。
- リンクが全てhttp://になる(HTTPSへリダイレクトしていると意外と気づきにくい)
- フォームでデータの登録に失敗する
- 決済に失敗する
- セキュリティ管理でSSLを強制のチェックが入れられない
この問題に対してEC-CUBE側ではどのような対応方法になるのか見ていきたいと思います。
EC-CUBE4系の場合
ロードバランサのIPが固定の場合
.envファイル等の設定でTRUSTED_PROXIESにロードバランサのIPを指定してやることで、EC-CUBEがSSLを認識するようになります。通常では下記のようにコメントアウトされています。
###> symfony/framework-bundle ### APP_ENV=prod APP_DEBUG=0 #TRUSTED_PROXIES=127.0.0.1,127.0.0.2 #TRUSTED_HOSTS=localhost,example.com ###< symfony/framework-bundle ###
ロードバランサのIPが変動する場合
ELB(AWS)のようにロードバランサのIPアドレスが変動する場合は、別の対応を行ってやる必要があります。
AWS用のコードがSymfonyのドキュメントには次のように記載されています。これをindex.phpに追記してやることになるでしょう。
この設定では全てのリクエストを信頼することになりますので、セキュリティグループでロードバランサからの通信以外を受け付けないように指定しておくと良いでしょう。(当然ではありますが)
Request::setTrustedProxies( // trust *all* requests ['127.0.0.1', $request->server->get('REMOTE_ADDR')], // if you're using ELB, otherwise use a constant from above Request::HEADER_X_FORWARDED_AWS_ELB );
EC-CUBE3系の場合
公式ドキュメントに記載がありますが、EC-CUBE3の場合はconfig.ymlに同様の設定があります。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。