起きた現象と経緯
Chromeでメンテナンス画面表示のテストを行っていたところ、下記の現象が発生した。
- メンテナンスモードに切り替える
- 該当URLにアクセスしてメンテナンス画面をリダイレクト表示
- メンテナンスモードを解除
- 該当URLにアクセスすると、メンテナンスモード解除済みであるにも関わらず、なぜかメンテナンス画面にリダイレクトされてしまう
現象発生時、nginx.confで下記例のようなメンテナンス画面転送の設定がされている状況。
〜省略〜
geo $allow_ip {
default 0;
XXX.XXX.XXX.XXX 1;
}
server {
listen 80;
server_name hogehoge.hogehoge.jp;
charset utf-8;
access_log /etc/log/hoge.log ltsv;
error_log /etc/log/hoge-error.log warn;
rewrite_log on;
client_body_temp_path /tmp;
client_max_body_size 75M;
client_body_buffer_size 64k;
〜省略〜
location / {
if ($allow_ip) {
break;
}
if (-f "/tmp/maintenance") {
# メンテナンスのtmpファイルがある場合、301リダイレクト
rewrite ^(.*)$ http://maintenance.hoge.jp? permanent;
}
〜省略〜
}
}
原因
上記のnginxの設定では、メンテナンス画面の表示に301リダイレクトを用いているが、Chromeは301リダイレクトのキャッシュを保持する仕様のため、キャッシュを読み取りメンテナンス画面にアクセスしてしまう動作になっていた。
リダイレクトキャッシュの削除方法
- Chromeのdevelopertoolを開き、networkタブの「Disable cache」をチェックする
- 該当のURLにアクセスする(リダイレクトされず正しく表示される)
- Chromeのdevtoolを開き、networkタブの「Disable cache」のチェックをはずす(はずしておかないとキャッシュ動作が一般ユーザー同等じゃなくなるので)
補足
- Chrome以外はリダイレクトキャッシュしていないようなので、この現象は起きない
- メンテナンス画面表示にはリダイレクトを用いずに503エラーを返しつつメンテナンス画面表示をするのがベターなようなので、そうしたほうがいいと思います(ページが移動したというわけではないので、リダイレクトは不適切だった)