3日後と5日後に、WebページAとWebページCへのアクセスを、メンテナンスページへリダイレクトさせたい、というような場合に便利なtipsです。
こんにちは。猫ITソリューションズ広報の齊藤メイ(♀)です。本日は、「Apacheで複数指定したスケジュールで複数指定したページをリダイレクトさせる」についてです。
日を跨いでWebサイトのメンテナンスを複数回行うこともあるかと思います。そういった時に役立つでしょう。.htaccessでももちろん可能ですが、今回はサーバーレベルの処理ということもありますので、Apacheの設定ファイルであるhttpd.confで実装しました。
要件と仕様
要件が生々しいですがあまり深く考えないでください。
要件
- 以下のページへアクセスしたら、メンテナンスページ(/maintenance.html)へリダイレクトさせる。
- /aaaa.html
- /bbbb.html
- リダイレクトさせる期間は以下の通り。
- 2016年11月25日(金)9:00~18:00
- 2016年12月07日(水)9:00~18:00
- 2016年12月08日(木)9:00~18:00
- できるだけ楽に実装・運用したい。(リダイレクト有効⇔無効のためにたびたび作業したくない)
- Webサイトの各ファイルには手を触れたくない
仕様
Apacheのmod_rewrite機能を利用します。これによりWebサイトの各ファイルに手を触れることなく、かつ予約設定ができるため当日にうんとこどっこい作業する必要がありません。今回試したApacheのバージョンは以下になります。
Apache/2.2.3
サンプル
コード
httpd.confへ以下の様に記述します。なおコードでは年月日時分で指定していますが、秒まで可能です。もっともそこまでシビアな条件をつけることはないと思いますが。
1 2 3 4 5 6 7 8 9 10 11 12 |
RewriteEngine on RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} >201611250859 RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} <201611251800 [OR] RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} >201612070859 RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} <201612071800 [OR] RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} >201612080859 RewriteCond %{TIME_YEAR}%{TIME_MON}%{TIME_DAY}%{TIME_HOUR}%{TIME_MIN} <201612081800 RewriteRule ^/(aaaa|bbbb)\.html /maintenance.html [R=302,L] |
設定反映
記述したら以下のコマンドを実行して、記述が間違いがないか確認します。「Syntax OK」と出れば問題ありません。もしエラーメッセージが出たらおそらく重複記述やhttpd.confへの記述順番に問題があるのかと思います。エラー内容に応じて修正してください。
1 |
# apachectl configtest |
問題なければApacheの設定をリロードさせます。リスタートしなくてもOKなのがミソ。リスタートだと現場ルールやWebサイトの規模によっては休日出勤もやむなしですからね。その必要がないのが実は一番このサンプルの良いところかもしれません。
1 |
# service httpd reload |
注意点
スタート年月日時分を1分前にして比較演算子を「$a >= $b」ではなく「$a > $b」にしています。少し気持ち悪いですね。>=でもイケそうな気がしますが>=にするとconfigtestでエラーになります。Apacheのバージョン(最新バージョン?)によってはイケるらしいので、気持ち悪いのが我慢できない方は>=で試してみてください。
以上です。
今はなくとも、いつか面倒なメンテナンスを要する時もあるかと思います。その時にお役に立てば幸いです。