リダイレクトは絶対URI?
RFCによると、絶対URIらしい
RFC2616 (HTTP/1.1) で、
「HTTPのリダイレクトレスポンスでは、Location は絶対URI(absoluteURI)で書かなければならない」
というのが定められているけど、これはあんまり守っていない。
けっこう絶対パスでやっちゃってる
「絶対URI」ということはexampleにもあるように、スキームから始めないといけないのだけど
/
から始まる「絶対パス」ですることも結構ある。
少なくとも、現代的な(2016年現在シェアの多い)ブラウザではこれで問題になったことがない。
ネスケとか、昔の一部のブラウザでは「相対パス」だと正常に動作しなかったことがあるらしい。
「絶対パス」だったらどうだったのかは知らないし、調べてもいない。
なんで絶対パスにしているかというと楽だから。
スキームの違うURIを生成する要件がない限り、絶対パスで書くのが圧倒的に楽だから。
ぜんぶがHTTPSなサイトだとそれで事が済む。
絶対URIを生成しようとすると、スキームとホスト名が必要になる。
スキームは環境変数の HTTPS とか、SERVER_PORT とか、X_FORWARDED_PROTO とかで判断する。
フレームワークにそういう機能が大抵ある。
でもホスト名はそういうのでは取れないので、アプリに定義しないといけない。
IPアドレス+ポートで開発環境を立てるなどする場合に、これをいちいち書き換えないとならないのが面倒。
たとえばPHPだと、$_SERVER['HTTP_HOST']
と $_SERVER['SERVER_NAME']
が一見使えそうだけど、
これはIPアドレスでアクセス可能な環境だとHostヘッダインジェクションになりうるので使えない。
キャッシュ汚染くらいしか攻撃は思いつかないけども。
というわけで、今のところ個人的には、スキームの違うURIを生成する要件が
リダイレクトしている。