nmtysh.log

Tech系のネタや日々の独り言などを書いています。

session.use_trans_sid を使わずに CakePHP 2.3 でURLにセッションIDを付与する方法

Cookie が使えないブラウザではURLにセッションIDを付与してセッションを引き回します。
PHP だと session.use_trans_sid を1にすることで、 PHP が透過的にセッションIDの付与を行ってくれます。
ですが、付与のタイミングが問題で以前書いたようにブラウザで正常に表示出来ない場合があります。

試行錯誤の結果 CakePHP 2.3 でセッションIDを付与できたので、備忘録として書いておきます。

・環境
CakePHP 2.3
PHP 5.4

public function _addSessionId() {
    ob_start();
    // 変換(付与)するタグを設定
    ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=');
    // セッションIDの付与設定を追加
    output_add_rewrite_var(Configure::read('Session.cookie'), CakeSession::id());
    echo $this->response->body();
    // セッションIDの付与を行わせる(flushさせないとrewriteされない)
    ob_end_flush();
    // セッション付与後のコンテンツを取得
    $out = ob_get_clean();

    // コンテンツを差し替え
    $this->response->body($out);

    // 後始末
    output_reset_rewrite_vars();
    ini_set('url_rewriter.tags', '');
}


事前準備として beforeFilter() 辺りで、 session.use_cookies とか session.use_only_cookies の設定をして、 CakeSession::start() しておく必要がありますが。
これを afterRenderer() で呼ぶと URL にセッションIDを付与できます。

ソースコードのコメントにも書いてある通り output_add_rewrite_var() でセッションIDの付与を設定していますが、flush時にしか置換が行われないため、外側にもう一段バッファを作成しています。

CakePHP でセッションIDを付与して出力するため、コンテントサイズと Content-Length の不一致が起こらず、ページが最後まで表示され、かつ Cookie が使えないブラウザでもセッションを引き回せるようになります。


関連:
CakePHP と Content-Length と imodeブラウザ(未解決)

参考:
php - output_add_rewrite_var problems - Stack Overflow