CakePHPでredirect

CakePHPのredirect関数ではまったのでメモ。

例えば、以下のようなソースコードがある。

class Test extends AppController {
 function beforeFilter() {
  if ($_SERVER['HTTPS'] != 'on') {
   $this->redirect('https://' . $_SERVER['HTTP_HOST'] . '/test/index');
  } 
 }
 function index() {
  if ($_SERVER['REMOTE_ADDR'] !== '218.14.253.60') {
   $this->render('error');
   return;
  }
  $this->redirect('confirm');
 }
 function confirm() {
  echo 'This id confirm.';
 }
}

https://xxx/test/indexにアクセスすると、
https://xxx/test/confirmにリダイレクトして、「This is confirm.」と表示したい。

しかしコレでは上手く動かないみたいで、errorが描画されしまうようだ。

いろいろ試した結果、原因は「$this->redirect('confirm')」が上手くいっていないようだと判明!
(時間がなくてテストコードを書いてないので、憶測でしかないけど・・・)

$this->redirect('confirm')のリダイレクト先が「http://xxx/test/confirm」みたいで、beforeFileterの処理で「https://xxx/test/index」にリダイレクトされてしまう。

コレを避けるために、リダイレクトの部分を以下のように変更しました。

$this->redirect('confirm'); → $this->redirect->('https://' . $_SERVER['HTTP_HOST'] . '/test/confirm');

$this->redirect('https://xxx/test/confirm');
と指定しなかったのは、ホストが違うサーバ上で同じ処理をしたい時にソースコードを変更しなくてもいいようにするためです。
参考

http://php.tekmemo.net/?p=737