タグ別アーカイブ: session.use_trans_sid

session.use_trans_sidが効かない理由

Cookie非対応の携帯でセッションを扱えるようにするため等に(セキュリティに問題があるが)利用する、

session.use_trans_sidで少しハマったので、メモしておきます。

 

結論からいうと、

session.use_trans_sidによるURL リライト機構は、

出力バッファリングを利用して出力の書換を行うから。

ということです。

 

session.use_trans_sidとは、

PHPのプログラム上にて、セッション管理にCookieを使わずにGET or POSTパラメータでセッションIDを引き回せるようにするために、

目標が相対パス(またはDocumentRootからの絶対パス)でのリンクやフォームに対して、

自動的にセッションIDのパラメータを付加してくれる設定オプションです。

PHPのマニュアルによると、

session.use_trans_sidは、透過的なセッション IDの付加をするかどうかを指定します。

圧倒的に説明が不足している気が・・・w

 

とりあえず、環境は以下の通りです。ただし、今回の原因において環境は関係ないです。

OS Amazon Linux AMI
Webサーバ Nginxリバースプロキシ・Apache + mod_php
PHPバージョン 5.3

 

調べた中でよくある理由としては、

  1. リンクが相対パス(またはDocumentRootからの絶対パス)で書かれていない。
  2. session.use_trans_sidが有効になる(ini_set(“session.use_trans_sid”, 1))前にsession_start()してしまっている
  3. session.use_only_cookiesが有効になっている(PHP5.3からデフォルト有効)

というものがほとんどでした。

ですが、それらは全てクリアした上でなお効かなかったのです。

 

調べているうちに見つけたのがoutput_add_rewrite_var()という関数のPHPのマニュアルの以下の文言。

この関数は、URL リライト機構に新しい名前/値の組を追加します。 名前および値は、URL (GET パラメータとして) およびフォーム (hidden フィールドとして) で追加されます。これは、session.use_trans_sid で透過的 URL リライティングが有効になっている場合に セッション ID が渡される方法と同じです。 絶対 URL (http://example.com/..) はリライトされないことに注意しましょう。

この関数の挙動は、php.ini パラメータ url_rewriter.tags によって制御されます。

注意: もし出力バッファリングが有効になっていない場合、この関数を コールすると出力バッファリングが暗黙的に開始されます。

注目すべきはこの部分。

注意: もし出力バッファリングが有効になっていない場合、この関数を コールすると出力バッファリングが暗黙的に開始されます。

出力をリライトするために、出力バッファリングを使用しているんですね。

 

そこで、ソースを見直してみると、

こんな記述が・・・

 

 

 

ob_end_clean()

 

 

 

 

犯人はお前だぁ~~~~

 

 出力バッファリングを無効にしてしまっていたために、

書き換えが行われなかったという訳でした。