ノノログ

ホーム / ブログ / baserCMS / さくらインターネットの共有サーバでbaserCMSの共有SSLがうまくいかないという話

さくらインターネットの共有サーバでbaserCMSの共有SSLがうまくいかないという話

現象

さくらインターネットの共有サーバを利用し、共有SSLを利用するとbaserCMSがSSLを正しく判断してくれなくてリダイレクトループする。
 

前提

さくらインターネットの共有サーバを利用

共有SSLを利用

非SSL利用時、SSL利用時のどちらもドキュメントルートを利用
※ サブディレクトリで共有SSLを利用すると更に深みにハマりそう
 

なんで?

SSLでアクセスしてるのに、baserCMSがSSLと判断してくれないから。

原因はbaserCMSというよりも、さくらの共有SSL領域のサーバ情報と、cakeのコアにあるSSL判別に理由があった。

さくらインターネットの共有領域ではbaserCMSが利用しているcakeのSSL判別プログラムがうまく動作しないことが原因だった。
 

具体的には?

SSLの判別はここでやってるらしい。

/cake/libs/controller/components/request_handler.php [LIne: 263]

/**
 * Returns true if the current request is over HTTPS, false otherwise.
 *
 * @return bool True if call is over HTTPS
 * @access public
 */
function isSSL() {
return env('HTTPS');
}

環境変数にHTTPSっていうのが定義されていれば、SSLとして判断するよーってことなんだろうが、さくらインターネットの共有SSLのサーバ情報は一般的な設定ではないため、HTTPSという変数は持っていない。

そのためcakePHPが「SSLではない」と判断するが、アクセスしているページはSSLに移動しようとする。

<SSLで通信してないからSSLへリダイレクトするよ!> ⇔ <[リダイレクト先] ここもSSLで通信しているページじゃないよ!> ⇔ ループ となっている。
 

どうしたらいいのよ!!(おこ)

コアに手をいれるのは嫌だけど、とりあえず動くようにするには、isSSLのメソッドに

if (isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) return true;

を追加すればいい。

function isSSL() {
		if (isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR'])) return true;
return env('HTTPS');
}
参考

さくらインターネットの共有SSLでは独自の「HTTP_X_SAKURA_FORWARDED_FOR」ってのが定義されてるから、それを見て判別するよ!ってことですね。

 

 

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