mochikoAsTechのdig日記

当方好きなコマンドはdigです!お友達から!!よろしくお願いします!!!

301でリダイレクトかけるとブラウザがキャッシュするので怖い

このURLにアクセスきたら、こっちのURLにリダイレクトー、みたいなのってよくあると思うんだけど、そのリダイレクトのときに深く考えずステータスコード301使っちゃうと結構怖いなーと思ったので書いておく。

とあるサイト(example.com)で、キャンペーンページ用にサブドメイン(campaign.example.com)を切ったとする。 中身はindex.htmlというぺらいちのページのみ。

んで、キャンペーンを実施。

後日、キャンペーン終了に伴って、campaign.example.comのページは閉じることになった。 けど、終了間際まで結構なアクセスが来てたので、突然404にするのもナンだろうということで、example.comにリダイレクトさせておいてね、ということになった。

その場合に、こんな設定をしたとする。

<VirtualHost *:80>
    ServerName campaign.example.com
    Redirect 301 / http://example.com/
</VirtualHost>

これでcampaign.example.comにアクセスすると、example.comへリダイレクトされるようになった。 campaign.example.comをブラウザ(Chrome)で開いて確認、いやー、よかったよかった。

そしてさらに後日、またキャンペーンやることになった、とする。 折角だし、またcampaign.example.comでやればいいよねー、とRedirectディレクティブの設定を消す。

index.htmlをアップして、ブラウザ(Chrome)でcampaign.example.comを開くと・・・・なぜかexample.comへ飛ばされる!

え、なんで、リダイレクトの設定消してconfigtestしてApache再起動したし、なんならctrl+F5しちゃうよ? でも何回F5叩いてcampaign.example.comを開いても、example.comへ飛ばされる。

えー、なんか設定間違えたのかな?と思い、普段使ってないブラウザ(IE)でcampaign.example.comを開くと・・・ちゃんと新しいキャンペーンページが表示される。なんで?なんで?

原因はステータスコード301でリダイレクトしたこと

原因はRedirectの後ろにかいたステータスコードの「301」でした。

Apache公式の mod_alias - Apache HTTP サーバ バージョン 2.4 に書いてあるけど、HTTPステータスコードの301は「Moved Permanently(恒久的な移動)」を表すので、「このサイトは、こっちの新しいサイトに完全に引っ越したから!もうこのサイトは廃止!今後はずっと新しいサイト見てね!」的な意図を表明していることになる。

ChromeでもIEでもFirefoxでも、一度この301でリダイレクトされると、次からは元のページ(campaign.example.com)を開くときに、サーバに見に行くことすらせず、自分の中のキャッシュで「こいつはexample.comにリダイレクト」と判断して、example.comに飛ばす模様。

解消方法はブラウザのキャッシュを消すこと。 でもChromeはキャッシュ消したら、301リダイレクトの記憶も消えて、ちゃんとcampaign.example.com開けるようになるけど、調べるとIEはキャッシュ消しても301リダイレクトの記憶は消えない模様。

なので、一時的にリダイレクトするだけなら、302の「Moved Temporarily(一時的な移動)」を使うべき。というかRedirectディレクティブは後ろにステータスコード書かなければ、デフォルトが302。余計なことしないが吉。

でもステータスコードもちょっとずつ意味合い変わってるし、今だったらステータスコードの307「Temporary Redirect」を使うべきなのかなー。どうなんだろう?

ブラウザの挙動なので、サーバ側でどうにもできない恐怖

これの何が怖いって「うっかり301にしてたわー」って後日気づいても、エンドユーザひとりひとりに「キャッシュ消して」と言いまわれるはずもなく、リダイレクトしてた間に訪れた人が多ければ多いほど、新しいキャンペーンページはユーザに見てもらえなくなるってこと。

逆に、長年使ってた集客力の高いドメインを手放すときは、新しいドメインに1年くらい301でリダイレクトさせた上で手放せば、再訪のユーザがドロップキャッチの餌食になる確率は低くなるのかも。