忍者ブログ

きままなひとりごと

引っ越しました。新しいブログはnmtysh.logです。
2015/12/27

ブログを引っ越しました

ブログの引っ越しを行いました。
別サービスへの移行になるため過去記事をすべて再確認しつつ、記事の削除やリンクの差し替えなどを行っています。
現在では役に立たなくなっているtipsなどは削除していますのでご了承ください。

新しいブログはこちらです。
nmtysh.log

今後は新しいブログのほうで更新していきますのでそちらをご覧ください。
2017/07/26 (Wed) 07:34

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2013/06/30 (Sun) 12:20

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

拍手[0回]

PR