Locationヘッダに相対パスが指定されているとき、パスとかクエリストリングの扱いが変。
Locationヘッダに相対パスが指定されている場合、以下のような処理が問題になっています。
まず、リダイレクト先URLを作るときに、URIのパス部分しか更新しません。つまり、リダイレクト元のURIにクエリストリングなどが含まれていると、リダイレクト先URIを絶対URIにするときに、リダイレクト元のクエリストリングが使われます。
そして、URIのパスを更新する処理で、Locationヘッダに指定された文字列をそのまま使っています。これは、つまり、"hoge_path?hoge_query#hoge_fragment"だった場合にこれをそのままURIのパスとして使う様になると言う事です。
まとめると、以下のような挙動になります。
http://example.com/?ichi-ban Location: redirect?ni-ban http://example.com/redirect?ni-ban?ichi-ban
と言う訳で、上記の様にリダイレクト先URLがおかしなものになってしまいます。
これ、世間的には既知ですよね?それとも、HTTP_Requestはあまり使われていないのでしょうか?みんな、socketとかcurlとかを使うのですか?
あれ?クエリストリングって、リダイレクトで引き継いだりしませんよね?
HTTP_Requestを修正して差分を記載していましたが、いろいろとバグだらけの修正をしてしまっていたので、消しました。

