普段、いろいろなところで使われているリダイレクト処理。
ブラウザ側では301リダレクトだと自動でキャッシュしています。(ブラウザによるかもしれませんが)

301リダイレクトについて

リダイレクトには「301リダイレクト(恒久的)」と「302リダイレクト(一時的)」の2種類あります。

301リダイレクト基本ずっとここにリダイレクトしますってときに使って
302リダイレクトちょっと一瞬ここにリダイレクトしときますってときに使います。

301リダイレクトはここぞというときにのみ!

で、本題ですが、301リダイレクト恒久的ということで、基本はもう変更しないという体裁だと思うので、ブラウザ側もそれを知ってか、ご丁寧に自動でキャッシュをしてくれます。

例えば、/a.htmlにアクセスしたら/b.htmlにリダイレクトしたいなと思って301リダイレクト設定をして

header('Location: /b.html', true, 301);

ブラウザで確認してしまったら最後、
あ、/b.htmlじゃなくて/c.htmlだったってなったときに

header('Location: /c.html', true, 301);

にしたとしても、ブラウザ側でキャッシュしているので
/a.htmlにアクセスすると、/b.htmlリダイレクトすることになります。

じゃあどうするべきだったかというと、
まずは、302リダイレクトを使って挙動を確認するべきです。

何はともあれまずは302リダイレクト

301リダイレクトで設定したいと思ったとしても、まずは302リダイレクトで挙動を確かめましょう。

header('Location: /b.html');

302リダイレクトは先述してますが、「一時的」という場合に使うリダイレクトです。ブラウザ側でもキャッシュすることはありません。

301リダイレクトでキャッシュされてしまった場合の対処法

301リダイレクトでキャッシュされてしまったものはもうしょうがないので、粛々と対応をしていかなければなりません。

①まだ自分しかキャッシュされていない場合

この場合は、各ブラウザのdevelopツールのようなものがあるのでそこでキャッシュを削除することで問題は解決します。
Google Chromeの場合ですと、DevToolsNetworkタブに移動して、Disable cacheというチェック項目があるのでチェックをして、リダイレクト前のページにアクセスしてください。(この場合はもちろん、301リダイレクト処理ははずしておくこと!)

これで、キャッシュが削除されているはずです。

②もう公開されていて不特定多数が閲覧している可能性がある場合

この場合が恐ろしくて、いろいろ調べてみたらなんとキャッシュが無期限設定ということのようなので、そのユーザー側で対応してもらうしかなさそうです。

ブラウザ自体を再起動すると、ChromeFirefoxではキャッシュクリアされるようですが、あまり期待しない方がいいかもですね。一般の人とかそんな再起動する人いないと思いますので。。たぶん笑

301リダイレクトをキャッシュさせないためにできること

まだキャッシュされていない状態だったら、明示的にキャッシュしないでねってブラウザ側に教えることができます。

header('Cache-Control: no-store');
header('Pragma: no-cache');

Cache-Control: no-store:ブラウザ、中間も含めキャッシュしないでねの言葉
Pragma: no-cache: HTTP/1.1の仕様より古い仕様用のキャッシュしないでねの言葉(念の為)

あとは、有効期限を設定するのもよいかもしれません。

header('Cache-Control: max-age=3600');

max-ageを使ってキャッシュに有効期限をつけてリダイレクトする。数字は「」なので、この場合だと3600秒、つまり1時間の有効期限を設定するという意味になります。

まとめ

リダイレクトは単純に文字を打てば簡単にできちゃうので、気軽にできる反面、リダイレクトのことをある程度知らないと意外とやっかいになる場合もあるのでリダイレクトを使う場合は、キャッシュのことも考えた設定にしてほしいと思います。