[FrontPage] 更新履歴 - サイトマップ - "RedirectLocation" 配下のコンテンツ - 過去を発掘 | [Snap.Shot]

to FrontPage RedirectLocation

(Fri, 06 Aug 2004 00:13:31 GMT+9)

Apacheの相対リダイレクトの取扱い

(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が渡されないのだ。

なんでこんなアホな仕様になってるか不思議なのだが、どうもこれは カスタムエラーレスポンス を実装したいがための仕様なのやもしれん。

なんとも邪魔くさい仕様だけど、もちろん回避する方法はある。 それも二通り。

  1. http:// を含めた、フルパス指定にする:

    Content-Type: text/plain
    Set-Cookie: test_cookie=1
    Location: http://example.com/same_path.cgi?next_value=2
    redirect myself
    

  2. ステータスヘッダをつける:

    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でトンネル掘って、怪しいポート番号で接続している場合とか←俺だけか)

自分自身に対するリダイレクトは、それはそれで便利なはずなので、↑を参考にぜひ活用してもらいたい。

  HelpPage メールでコメント

© 2000-2012 Yukimasa TAKANO, all RIGHTs reserved.