Webブラウザの301リダイレクトキャッシュをクリアするには?
はじめに
Webサーバーで301リダイレクトを設定すると、Google ChromなどWebブラウザによっては、その情報をキャッシュします。
301リダイレクト情報をキャッシュすると、再度リダイレクト元のURLを指定した場合、リダイレクト元のサーバーにリクエストをせずに、ブラウザから直接リダイレクト先サーバーにアクセスします。
このため、リダイレクト元のサーバーで何らかの変更があっても、リダイレクト情報をキャッシュしてしまったWebブラウザに対しては、その変更が効きません。
「301リダイレクト」は、「Moved Permanently」であり、「恒久的な移動」を意味するので、Webブラウザのこのような挙動は正常といえます。
では、この「301リダイレクト」をクリアしたいときは、どうすればよいのでしょうか?
結論からいいますと、(2024年10月時点では)
「Webサーバー側で、301リダイレクトの向きを逆に設定する」
と、元のリダイレクトはクリアされて、後で設定したリダイレクトのキャッシュが残ることがわかりました。
経緯
先日、サーバー設定作業で大きなミスをしてしまいました。
とあるWebサイトのドメインを変更するとのことで、Apacheでリダイレクト設定をする機会がありました。
ここでは仮に、新旧ドメインを以下とします。
旧ドメイン
https://old.example.jp/
新ドメイン
https://new.example.jp/
ドメイン変更期間は、諸事情により、以下のような流れとなりました。
(1) 一定期間、新ドメインから旧ドメインにリダイレクトする。
(2) 3週間後、逆向きの旧ドメインから新ドメインにリダイレクトする。
Apacheでのリダイレクト設定は様々な方法がありますが、僕は mod_rewrite の RewriteRule を使用することが多いです。
(1)では、new.example.jp に関する Apache VirtualHost Config で以下のように設定します。
一時的なリダイレクトですから、RewriteRule で「302リダイレクト」を指定します。
<VirtualHost *:443> ... ServerName new.example.jp:443 ... # Redirect RewriteEngine On RewriteRule ^/(.*)$ https://old.example.jp/$1 [R=302,L] ... </VirtualHost>
(2)では、(1)で設定した new.example.jp に関するリダイレクト設定を解除し、old.example.jp に関する Apache VirtualHost Config で以下のように設定します。
こちらは永久リダイレクトとなるので、RewriteRule で「301リダイレクト」を指定します。
<VirtualHost *:443> ... ServerName old.example.jp:443 ... # Redirect RewriteEngine On RewriteRule ^/(.*)$ https://new.example.jp/$1 [R=301,L] ... </VirtualHost>
上記が正しい手順なのですが、(2)の作業を実施する際に、以前行った(1)のリダイレクトを「302」ではなく「301」と設定してしまったことに気づきました。
(1)の設定後に新ドメインにアクセスしたWebブラウザには、新ドメインのURLを指定したときに、旧ドメインサーバーにアクセスするリダイレクトキャッシュが残っています。
Webブラウザにリダイレクトキャッシュが残っている状態で、(2)の旧ドメインから新ドメインへのリダイレクトを設定すると、Webブラウザ側で旧ドメインへのアクセス試行と新ドメインへのアクセス試行を繰り返すリダイレクトループが発生するのではないか、という懸念が出てきました。
※なお、このリダイレクトループ発生の可能性は、クライアント側のWebブラウザでのお話です。「リダイレクト元サーバーにアクセスしてくれない」のが問題なので、新旧両サーバーにアクセスを繰り返すことでサーバー負荷の上昇を招く、というわけではありません。
Webブラウザの設定画面でキャッシュをクリアすれば、リダイレクトキャッシュもクリアされるようなのですが、一般公開されているWebサーバーですので、ユーザーにそのようなお願いをするわけにもいきません。
いろいろ調査したところ、Chromeについては、
「Webサーバー側で、301リダイレクトの向きを逆に設定する」
とリダイレクトループが発生せずに、元のリダイレクトキャッシュをクリアする、という情報が得られました。
(参考)
・ユーザの Chrome ブラウザの 301 Redirect cache をクリアする方法 – knmts.com
https://knmts.com/as-a-engineer-88/
・301 Redirects and Reversing a 301 Redirect – Chad Schulz
https://squalr.us/2021/04/301-redirects-and-reversing-a-301-redirect/
・Fixing 301 Redirects in Chrome – Chrispymm
https://chrispymm.co.uk/blog/fixing-301-redirects
つまり、「新ドメインから旧ドメインへの301リダイレクト」と設定し、
その後、「旧ドメインから新ドメインへの301リダイレクト」と設定すると、
最初に保存した301リダイレクトキャッシュがクリアされて、意図したとおり旧ドメインから新ドメインへリダイレクトしてくれる(そして、新しいほうの301リダイレクトキャッシュが残る)、
ということですね。
Webブラウザで無限ループ状況とならないよう、フェイルセーフ機能を備えているというわけです。
早速、手持ちのサーバーとクライアント端末&Webブラウザで、
「上記(1)で302ではなく301リダイレクトを設定&(2)を設定」
をテストしたところ、上記の情報どおりに動作し、リダイレクトキャッシュがクリアされて正しくページ表示することが確認できました。
テストでは、以下の結果が得られました。
- WindowsのChrome, Edge, Firefox は、(1)の設定後に301リダイレクトをキャッシュし、旧ドメインのURL入力時は、旧ドメインのサーバーにはアクセスせず、直接リダイレクト先の新ドメインサーバーにアクセスした。
- iPhoneのChrome, Safari は、(1)の設定後に301リダイレクトをキャッシュせず、旧ドメインのURL入力時は、旧ドメインサーバーにアクセスしてから、新ドメインサーバーにリダイレクトアクセスした。
- (2)の設定後、WindowsのChromeで新ドメインのURLを入力したとき、一瞬「Too Many Redirects」が表示されたが、すぐに新ドメインサーバーにアクセス、ページを表示した。それ以外のWebブラウザでは、とくにエラーがなく新ドメインサーバーにアクセス、ページを表示した。
※2024年10月にテストした際の結果です。端末やWebブラウザのバージョンによっては、異なる結果となる可能性があります。
その後、本番実環境でも同じように設定して、解決しました。
クライアントユーザー環境でリダイレクトループが発生したらどうしよう、とかなり冷や汗をかきましたが、無事解決できてよかったです。
今回は、幸いにも「もともと逆向きのリダイレクトを設定する」予定で、それでたまたまうまくいきました。
ですが、逆向きの設定を行う予定がない場合に301のリダイレクト先URLを間違えると、面倒なことになります。
これまでも、何気なく301リダイレクトの設定を行っていましたが、怖いですね。
今後の作業時は以下を徹底します。
- 一時的なリダイレクトは、302リダイレクトで設定する。
- 恒久的なリダイレクトは、302リダイレクト設定で十分確認してから、301リダイレクトを設定する。
気になること
このように、301リダイレクトを設定し、短期間でその301リダイレクトを逆向きに設定した場合、Googleのような検索エンジンはどのように判断するのでしょうか?
検索順位を下げるような、ペナルティがあるのかどうか。。
最終的な301リダイレクト設定後、2週間以上経過していますが、Googlebotによるアクセスは新旧ドメインどちらにも届いており、検索結果は、新旧ドメインがどちらも表示されています。
Googleのコミュニティでは、リダイレクトに関して、以下のような記事が公開されていますが、短期間でリダイレクトを逆向きに設定した場合の動作については、とくに記載がありません。
現状では、よくわかりません。
検索順位もとくに変わっていないように見え、このまま新ドメインのみ検索結果に表示されるよう収束するとよいのですが。