###前提
CodeIgniter2で運用中のサービスです。
セッション機構として、CodeIgniterデフォルトのCookie利用の仕組みを使っています。
###発生している問題
レスポンスヘッダが長くなりすぎる(4KB超)ことでインフラ側に問題が発生しています。
PHPでデバッグしながら確認してみると、
セッションライブラリの初期化や、
$this->session->set_userdata の呼出タイミングで、
都度PHPのsetcookieが呼ばれているようで、セッションのSet-Cookie(内容もほとんど重複)が複数のSet-Cookie: としてヘッダーに含まれて送信されています。
###該当のソースコード
system/libraries/Session.php(CodeIgniterのデフォルト)
PHP
1 2 /** 3 * Write the session cookie 4 * 5 * @access public 6 * @return void 7 */ 8 function _set_cookie($cookie_data = NULL) 9 { 10 if (is_null($cookie_data)) 11 { 12 $cookie_data = $this->userdata; 13 } 14 15 // Serialize the userdata for the cookie 16 $cookie_data = $this->_serialize($cookie_data); 17 18 if ($this->sess_encrypt_cookie == TRUE) 19 { 20 $cookie_data = $this->CI->encrypt->encode($cookie_data); 21 } 22 23 $cookie_data .= hash_hmac('sha1', $cookie_data, $this->encryption_key); 24 25 $expire = ($this->sess_expire_on_close === TRUE) ? 0 : $this->sess_expiration + time(); 26 27 // Set the cookie 28 setcookie( 29 $this->sess_cookie_name, 30 $cookie_data, 31 $expire, 32 $this->cookie_path, 33 $this->cookie_domain, 34 $this->cookie_secure 35 ); 36 }
この_set_cookie()が初期化やset_userdataの都度呼ばれています。
またconfig.php内のセッション関連の設定は以下の通りです。
PHP
1$config['sess_cookie_name'] = 'ci_session'; 2$config['sess_expiration'] = 7200; 3$config['sess_expire_on_close'] = TRUE; 4$config['sess_encrypt_cookie'] = TRUE; 5$config['sess_use_database'] = FALSE; 6$config['sess_table_name'] = 'ci_sessions'; 7$config['sess_match_ip'] = FALSE; 8$config['sess_match_useragent'] = TRUE; 9$config['sess_time_to_update'] = 300;
###試したこと
検証用コントローラを作ってシンプルなコードで呼び出しましたが、現象は変わりませんでした。
また、同様の報告を探しましたが見つかりませんでした。
###その他
運用中のサービスのため、セッション機構自体を大幅な変更(Cookie→DBにする、自前のセッションを利用する、等)は避けたいです。
RFC 6265でも「サーバは、同じ応答内に同じ cookie-name の複数の Set-Cookie ヘッダを内包するべきでない」との記載があり、
上述の挙動がCIの仕様とも考えにくいので、何らか対策が可能ではと思うのですが、ご存知の方いらっしゃらないでしょうか。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/07 00:06
2017/09/12 08:07