Yii のサイトにあるチュートリアルのブログが動作するようになるまで、意外とハードルが高かった。その中で、ブラウザを起動して最初にサイトを表示したとき、メニューのリンクに PHP のセッションIDが付加されてしまうのを回避するのに、時間が掛ってしまった。
xrea サーバーではセーフモードが ON にセットされている。そのためファイル出力やデータアップロードの操作で、ファイルの保護モードに引っかかる事がある(このモードは5.3.0では非推奨、6.0.0で削除のようだ)。
この回避方法は、PHP を CGIモードで動作させるようにするのが手っ取り早い。タスクの起動に時間が掛るようで嫌われることもあるようだが、そこがアクセススピードのボトルネックにならないのなら、気にする必要はないだろう。これは、.htaccess に次のように指定する。
AddHandler application/x-httpd-phpcgi .php
さて、リンクに付加されたセッションIDが表示されないようにするためには、php.ini の「use_cookies、use_only_cookies、use_trans_sid」をそれぞれ「On, On, 0」とすれば良い。で、これも .htaccess に以下のように指定した。
php_flag session.use_only_cookies on
php_value session.use_trans_sid 0
が、これがいろいろと書き変えて見るが、どーもうまくいかない。なのでこの方法は諦めることにした。
CakePHP の config/core.php のようなパラメータ設定ファイルが、Yii では config/main.php でできるようになっている。Yii でも何かできないか試したところ、コアアプリケーションコンポーネントに「session: CHttpSession(framework/web/CHttpSession.php)」が組み込まれており、「savePath」プロパティの設定でセッションデータの保存先を変更できる事が分かった。
「use_only_cookies」を指定する「set_ini」命令がないか探して見ると、同じ「CHttpSession」コンポーネントに「setCookieMode()」メソッドがあり、また「cookieMode」というプロパティもあるので、どうやら核心部に近付いてきたようだ。「cookieMode」には、「none、allow、only」の3つがありデフォルトは「allow」である。ならこれを「only」にすればいい訳だ。早速次のように「savePath」も含めて設定した。
'components'=>array( : 'session'=>array( 'cookieMode' => 'only', 'savePath' => '/virtual/xxx/xxx', ), ),
果たして結果は….. orz
うーん、どうしたものか。悩みながらも「setCookieMode()」メソッドを見ると「use_cookies」と「use_only_cookies」は設定しているが、「use_trans_sid」の設定がない。
| \ __ / _ (m) _ピコン |ミ| / `´ \ ∧ ∧ (・∀・) ノ( )ヽ < >
これだ!
で、「setCookieMode()」メソッドに「ini_set(‘session.use_trans_sid’, ‘0’);」を次のように追加したところ、目出度くリンクから PHPSESSID が追加されなくなった。
else if ($value==='only') { ini_set('session.use_cookies', '1'); ini_set('session.use_only_cookies', '1'); ini_set('session.use_trans_sid', '0'); }
コアソースを弄るのはどうも、ではありますが(バージョンは yii-1.1.0.r1700)。