脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

リダイレクトは絶対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を生成する要件が

リダイレクトしている。