ということはモバイル向けサービスで良くあることだと思う。
んで、ローカルでテスト中、件の無限ループが発生した。
apacheのアクセスログを見ると、
hoge.php?foo=var hoge.php?foo=var&PHPSESSID=(SSID1) hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2) ... hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2)&PHPSESSID=(SSID3)&PHPSESSID=(SSID4)&PHPSESSID=(SSID5)&PHPSESSID=(SSID6) ...
すなわち、
hoge.php?foo=varにアクセスがあって、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&PHPSESSID=(SSID1)おやおや、セッションIDがついてないのでつけましょう。そしてリダイレクト。
hoge.php?foo=var&PHPSESSID=(SSID1)&PHPSESSID=(SSID2)っという具合に、無限に繰り返し、URL長エラーになるまで繰り返してた。っということ。
原因は、"&"であるべきセパレータが"&"になっていること。
"PHPSESSID"のつもりが、"amp;PHPSESSID"になっちゃったわけだ。
さて、誰の仕業だろう?
プログラムで発行しているときにやっちまった?
Net_URLを使ってるから、この子のせい?
PHPが自動で付けたもの?
Apacheが変換した?
とまあ、色々調べてしまったよ。
結論を言うのは簡単だなぁ。。
その結論とは、
PHPの設定がヘンだった。それと、PHPの設定をNet_URLが忠実に読み込んでいたから。
Net_URL::getQueryString()で、クエリストリングのセパレータを、ini_get('arg_separator.output')で取ってきてます。
んで、オイラのWindowsなxampp環境では、php.iniファイルで下記の通り指定していた。
arg_separator.output = "&"
むむむ。なんでこんなことしたんだっけ?
はい。これをコメントアウトして、サービスを再起動すると、…ちゃんと動いた。
以下、苦労した原因を箇条書きしておく。繰り返さないように(´・ω・`)
・デバッグ用にリダイレクトURLをHTML出力してみたわけだが、<textarea>タグ内ならば生のソースが表示されるハズ、と初歩的な勘違い
→ "&"と表示されて、うーん、ここまでは上手く行ってるのに…と誤解。実際は"&"だったのに
→ "&"と表示されて、うーん、ここまでは上手く行ってるのに…と誤解。実際は"&"だったのに
・php.iniを書き換えたら即時適用されそうな気がしていた
→ apacheを最起動しないと読まないよ。Windowsの場合サービスの再起動が必要。
→ apacheを最起動しないと読まないよ。Windowsの場合サービスの再起動が必要。
・php.iniを変更するなら、なぜそうしたかメモっておこうよ。。
・グーグル先生を過信し過ぎ(←あえて冗長表現してみた)。
Comments