FC2ブログ

リバースプロキシ構成になったらCakePHPのリダイレクトが無限ループ

久々にハマったので。

ローカル環境では普通に単一サーバ構成。別の開発環境ではWebサーバの外側にリバースプロキシがあって。で、そうなるとWebサーバにとって、今は一体SSLで通信しているのかしてないのかを判別する方法が変わってくるそうで。

普通なら、

$_SERVER['HTTPS']が「on」なら「SSL」

ですけど、リバースプロキシが挟まる場合には、

$_SERVER['X-Forwarded-Proto']が「https」

になるそうで。伝聞形が多いのは自分がリバースプロキシよく知らんからです…。

で、開発環境に持っていったらリダイレクトがループしているとのこと。FireFoxだから分かったのですけど。色々調べてたら、特定URLに対してはSSLでの接続のみを許可するよーって処理をしているところが臭かったのでした。

こちらに書いてあるような処理をかましていたわけです。

[CakePHP]Cakeで初めてSSLを使ったメモ | HappyQuality

// SSL呼出エラー処理
function _sslFail($err) {

if ($err === 'secure') {
// リダイレクト先は$this->paramsからとってるけど、別のパラメータから取得した方がいいのかな?キャメライズされないのでいつもここからとってるんですが^^;
$this->redirect("https://".BASE_URL."/".$this->params['controller']."/".$this->params['action']);
exit;
}

}

ここで、関数の引数である$errはどこから?と調べたら「cake/libs/controller/components/request_handler.php」の

/**
* 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');
}

がリバースプロキシの都合なんておかまい無しだったわけで。当然でしょうけど。泥臭くはありますが、

/**
* Returns true if the current request is over HTTPS, false otherwise.
*
* @return bool True if call is over HTTPS
* @access public
*/
function isSSL() {
if(isset($_SERVER['HTTPS'])) {
return env('HTTPS');
else if(isset($_SERVER['X-FORWARDED-PROTO']) && $_SERVER['X-FORWARDED-PROTO'] = 'https'){
return true;
} else {
return false;
}
}

こんな感じにして解決と。奥が深いすなー。これをやっておかないといつまでたっても「お前いつまでHTTPで来るんだよー」ってことになるのでしたとさ。
スポンサーサイト




実験@2009/10/21 23:52   | 0 comments | 0 trackbacks |

コメント

コメントの投稿


秘密にする

«  | HOME |  »

いろいろ作ったり

プロフィール

icot

Author:icot
総合電気メーカで働く会社員でしたがいい年にも関わらずコンサルに転職。お酒、ジョギング、音楽、本、料理をこよなく愛してます。ここでは、日々感じた事を書き連ねるとともに、いろいろ実験してみたりしてます。
icotfeels[at]gmail.com

これまでに感じたこと