WordPress移行始末(4)リダイレクト設定

リダイレクト設定

ブログの移行とサーバの移転を同時におこなったので、旧サイトや旧投稿からのリダイレクトを設定してやらねばならない。WPにはそのためのプラグインもあるのだが、根本的な解決として、.htaccessファイルに書き込む方式で行きたい。そのためには、まずリダイレクトのためのリストを作成しなければならない。

今回リダイレクトしたいのは、旧サイトのトップページ、各投稿のパーマリンク、Feedの三種類とした。月別やカテゴリー別アーカイヴはリダイレクトなし。たぶんそこにブックマークしているひとは少ないだろうから。

このうち手間がかかるのは各投稿のパーマリンクである。いちいち手でリストを書くと大変だし誤りも混入しがちなので、MTの「新規テンプレート追加」から書き出すことにした。スクリプトはつぎのとおりである。

<?php
require('wp-config.php');
header('Content-type: text/plain');
?>
<MTEntries lastn="999999">
Redirect Permanent /blog/<$MTEntryID pad="1"$>.php http://swingbooks.jp/<$MTEntryID$></MTEntries>

旧サイトでのブログが、…/blog/ というディレクトの下にあったものを、新サイトでは一階層あげ、対応させている。Permanentをつけておくと、301リダイレクト扱い(当該ページの永久移転)をしてくれる。これで問題なく出力された。なおこのスクリプトもネットで見つけた複数の記事を参考にしたもの。とくに参考にさせていただいた記事をあげておく。

ただし前回説明したように、WPに移行するにあたってパーマリンクに修正をくわえている。そのため、書き出されたリストをエディタで開き、やはり一件ずつ、WPで修正したとおりのパーマリンクに修正してゆく。これも自動化は不可能なので、地道に人力でやるしかない。もう目がしょぼしょぼである。

ブログのURLを指定する

今回から、ブログURLをhttp://swingbooks.jp/にしたいと考えた。これまではドメイン名の下に/blog/というディレクトリをつくって、そこで運用していたのだが、ルートにあげたいのである。

とはいえ、新しいサーバにあっても、実際にWPの格納されているディレクトリは、ルートではなくその下に設置したWP用のディレクトリ内にある。素のURLは、当然もっとややこしい。余談ながら、エックスサーバ―において、ネームサーバ変更以前に独自ドメインを設定して作業したいばあいは、サーバパネルのSSL設定から確認用URLを発行すればよい。https://…というSSL用のが発行されるので、sを削除してhttp://…で接続すればよい。この方法も見つけるのにしばし手間取った。

さて、WPが設置してある素のURLを、対外的に表示されるURLに読み替える設定は、WPの管理画面から指定可能である。ただしそれだけでは不十分で、FTPでとエディタでちょっとした作業が必要となる。詳細はCodexの「WPを専用ディレクトリに配置する」に書いてある。

ところが、またも何度やってもブログURLに遷移してくれない。ほどなくして原因が判明した。エックスサーバーのルートに最初から入っているindex.htmlファイルを削除すればよかったのだ。またも間抜けな失敗である。気づいてみれば何でもないことなのだが、気づくまでは心穏やかではいられない。

ここまで作業が完了したところで、独自ドメインのネームサーバの設定を、古いレンタルサーバ(ロリポップである)からエックスサーバのWPのほうへ変更した。変更が反映されるまで時間がかかるからもう寝よう。

二重リダイレクト

翌日のお昼ごろにはネームサーバの変更が浸透し、WPで構築したほうがブラウザに表示されるようになった。ところが変だ。表示されるのはトップページだけ。各投稿に飛ぼうと見出しをクリックしても、「500 internal server error」が出る。こりゃ.htaccessの設定がまずいようだ。

Codexをあらためて読む。すると、案内書には書いていなかったような気がするのだが、WPの管理画面からパーマリンクの設定を変更し保存すべしと書いてある。やってみると、.htaccessのコードが生成する。自動で書き込んでくれるはずだが、念のためコピーしたうえで、FTPでアクセスしてエディタで.htaccessファイルを開き、そのコードを貼りつける。これで、トップページから各投稿へ飛ぶことができるようになった。なんだ、わりと簡単に解決した。

ぬか喜びだった。

旧トップページのURL(http://swingbooks.jp/blog/)は、たしかに新しいURL(http://swingbooks.jp/)へリダイレクトされる。しかしそれ以外の全投稿のリダイレクトが効いていない。.htaccessファイルの記述の仕方がまずかったのだ。

トップページをリダイレクトさせるつもりの記述が、けっきょく旧サイトの…/blog/以下のディレクトリ全体を、そのまま一階層あげるように読み替えられている。つまり、たとえば旧サイト上で「http://swingbooks.jp/blog/2001/05/post_108.html」(ダミーです)というパーマリンクをもつ記事は、機械的に/blog/を削除したURLである「http://swingbooks.jp/2001/05/post_108.html」へリダイレクトされてしまっているのである。そんなパーマリンクは存在しないため「404 Page Not Found」が表示されてしまう。

これを、新サイト上のパーマリンクである「http://swingbooks.jp/2001/05/06/permalink/」へ飛ぶようにしたい。ただしトップページのリダイレクトを維持したまま。どうすりゃいいのだ?

いろいろ検索してみるが、こんな条件に適合した記事はみつからない。困ったなあとおもい、市川からバスに揺られているうちに、ふと思いついた。二重にリダイレクトすればうまくいくのではあるまいか。

つまり、いったん旧URLの「../blog/」が削除されたURLへリダイレクトされたものが、さらに新サイトの各投稿のパーマリンクへ対応するようにもう一度リダイレクトするように設定すればいいわけだ。だとすれば、.htaccessファイルのリダイレクトの記述は、

Redirect Permanent /blog/2001/05/post_108.html http://swingbooks.jp/2001/05/06/permalink/

としていたものから、「/blog/」を削除して、つぎのように書き換えればいい。(改行を入れる箇所は行末の1箇所のみ。Permanentの直後と、旧URLと新URLのあいだには、それぞれ半角スペースが挿入される。)

Redirect Permanent /2001/05/post_108.html http://swingbooks.jp/2001/05/06/permalink/

あとは.htaccessファイルをエディタで開いて作業して上書き保存。これで解決した。

これにてMT→WP移行にからむ問題は完全に解決した。ブログにもそう書いた。もちろん甘かった。まだあったのだ。執筆した記事のプレビューができないことが判明したのである。