[FrontPage] | 更新履歴 - サイトマップ - "RedirectLocation" 配下のコンテンツ - 過去を発掘 | [Snap.Shot] |
RedirectLocation |
(2004-08-06 takano) これ、前にもどっかで書いた気がするのだが、すっかり忘れていて見あたらなかったので、改めてメモっておく。
いつごろからか分からないが(少なくとも1.3.27, 2.0.43くらいからそう)、Locationヘッダの出力を相対パスで行った場合、ブラウザへレスポンスを返さずに、Apache自身が再処理をかけようとしてしまうみたい。
たとえば、 http://example.com/same_path.cgi?first_value=1 に対するリクエストのレスポンスとして、こんなのを返すとする:
Content-Type: text/plain Set-Cookie: test_cookie=1 Location: /same_path.cgi?next_value=2 redirect myself
こんなんやって、ブラウザがcookieを受け入れる状態かどうかをチェック…したいのだが、このままだと冒頭の理由でうまくいかない。
内部的に、勝手に /same_path.cgi
を再度呼び出そうとしてしまい、ブラウザ側にcookieが渡されないのだ。
なんでこんなアホな仕様になってるか不思議なのだが、どうもこれは カスタムエラーレスポンス を実装したいがための仕様なのやもしれん。
なんとも邪魔くさい仕様だけど、もちろん回避する方法はある。 それも二通り。
http://
を含めた、フルパス指定にする:
Content-Type: text/plain Set-Cookie: test_cookie=1 Location: http://example.com/same_path.cgi?next_value=2 redirect myself
ステータスヘッダをつける:
Status: 302 Redirect Content-Type: text/plain Set-Cookie: test_cookie=1 Location: /same_path.cgi?next_value=2 redirect myself
もともと、HTTP 1.0の仕様は(たしか)「Locationヘッダはfull URLでなくてはならない」となっていたハズ。 けど現実問題として、IEもネスケも相対パスのLocationヘッダをちゃんと解釈してくれる。 Operaは知らないけど多分大丈夫だろう。 Lynxかw3mがwarningを出していたような気がするけど、それでも警告が出るだけで、リダイレクトそのものは ちゃんと処理してくれたハズだ。 なにより、絶対パス指定しようにも、ユーザによってURLが異なり、指定しようがないケースだってあるだろう。 (SSHでトンネル掘って、怪しいポート番号で接続している場合とか←俺だけか)
自分自身に対するリダイレクトは、それはそれで便利なはずなので、↑を参考にぜひ活用してもらいたい。