サイトクローズに伴う対応

サービスの終わりは儚く哀愁が漂うものです。サービスページのクローズをする時に「サービスが終了しました」的な文言をホームページに表示して、ホームページ以外のページにアクセスした場合、ホームページにリダイレクトするように.htaccessで制御する方法をメモしておきます。

301リダイレクト

本当にシンプルなのですが、以下のように書けばOKです。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/$)
RewriteRule ^(.*)$ / [R=301,L]

3行目の記述は必ず記述します。「ホームページでなければ」という条件なのですが、これが抜けているとホームページにアクセスした時に無限ループに陥ります。

ホームページへのリダイレクトはこれでOKなのですが、例えばホームページでCSSファイルやJavaScriptファイル、画像ファイルなどの読み込みをしていた場合、これらのファイルもリダイレクトされてしまいます。特定のフォルダやファイル(拡張子で分岐など)を対象外にする場合には、ノットイコールの条件を増やしてあげれば良いです。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/$)
RewriteCond %{REQUEST_URI} !(^/images/)
RewriteCond %{REQUEST_URI} !(\.css$)
RewriteCond %{REQUEST_URI} !(\.js$)
RewriteRule ^(.*)$ / [R=301,L]

これでOK。こうやって1行ずつ条件を書いてもよいですが、少なければOR文(|)でまとめてあげてもいいですね。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/$|^/images/|\.css$|\.js$)
RewriteRule ^(.*)$ / [R=301,L]

できた!\(^o^)/
最後に余談なのですが、WordPressでこの設定をするとindex.php(もしくはhome.php)より優先度の高いページテンプレートがあった場合、single.phpやpage.phpが表示されてURLはホームページにリダイレクトされるという摩訶不思議アドベンチャーなことが起こりました。
index.php以外のテンプレートページを削除したらうまくいきました。あ、だけどテンプレートがindex.phpしかないから当たり前といえば当たり前か。