chromeは、301リダイレクトをキャッシュしている
最近、かなりリダイレクト使うサービスを作っていて、
たまたまchromeでチェックをして気がついた。
もう少し具体的にどういう事かというと、
"HTTP/1.1 301 Moved Permanently"などのヘッダーを付けて、
リダイレクトさせると、chromeの場合、
そのリダイレクト先をキャッシュし、
2度目以降、同じURLへのアクセスは、
リダイレクト先のURLへ直接飛んでいきます。
普通のユーザーであれば、全く問題ないのですが、
開発者でリダイレクターでカウンターや解析用のcookieを発行を考えている場合、
正常に機能しなくなってしまうので注意が必要です。
解決方法は、簡単で、
"Pragma: no-cache"などのキャッシュさせないような
ヘッダー情報も付けるだけです。
ちなみに、"Pragma: no-cache"は、HTTP/1.0用で、
HTTP/1.1ではCache-Controlが使えるのそちらで
設定すべきかもしれませんが、"Pragma: no-cache"でも問題なさそうです。
詳しくはRFCとかHTTP/1.0,1.1の仕様を参照しましょう。。
例えば、PHPで301リダイレクトは、
こんな感じで行けますが、
リダイレクタで何らかの処理を行う場合は必ず
のようにキャッシュさせないヘッダーを必ず挿入しましょう。
chromeだとすっ飛ばされちゃいます。
ちなみに、chromeでこのリダイレクト先のキャッシュを削除したい場合は
環境設定 -> 高度な設定 -> 閲覧履歴データの消去
でキャッシュを削除すると、
301リダイレクトのキャッシュも削除されます。
調べてみると、当然同じ気づきをされている方がおりました。
444 Failed: 301 リダイレクトをchromeがキャッシュする
あと、これを意識しないでリダイレクトさせると、
chromeでセキュリティ的に問題が出てくるケースもあると思いますので、
注意しましょう。
僕が知る限りでは、他のブラウザでは、
301リダイレクトをキャッシュしていないような感じがするのですが、
chromeのこの301リダイレクトをキャッシュする仕様は、
RFC的に本当は妥当なのかも…、とも思ったり。
その辺、RFCやHTTP/1.1プロコトルの仕様など、
本当はちゃんと調べるべきなんだろうな。。。
※以下、3/7追記
コメントにてご指摘頂いたので、
リダイレクトについて少し調べてみました。
下記、参考になりました。
HTTPステータスコード - Wikipedia
studyinghttp.net - このウェブサイトは販売用です! - 解説 仕様書 利用 技術 である 手法 日本語訳 プログラミング リソースおよび情報
で、
自分の場合、301ではないとは分かったのですが、
302、303、307リダイレクトの違いがいまいちわからなかったのですが、
下記のエントリーがよくまとめられていました。
HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて – cyano
自分の場合、本来”303 See Other”を使うべきだとわかりました。
あと、今回の内容とは直接は関係無いのですが、
リダイレクトのメソッドの挙動をブラウザ毎にまとめてある素晴らしいエントリー
があったので、備忘録的にご紹介
各種リダイレクトに関するブラウザの挙動の違い:YuO's weblog - Computers:So-netブログ
リダイレクトの種類、勉強になったな〜。