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 |
調べた中でよくある理由としては、
- リンクが相対パス(またはDocumentRootからの絶対パス)で書かれていない。
- session.use_trans_sidが有効になる(ini_set(“session.use_trans_sid”, 1))前にsession_start()してしまっている
- 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()
犯人はお前だぁ~~~~