これは、かなりハマった。
概要
やりたいことはgeeklogからWordPressへの引越し。(WordPressはもう稼動していて、geeklogは更新が止まっている)ただ、思うようなエクスポート・インポートツールが無かった。
「この記事は引っ越しました」と記事内に1つ1つ書いてもよいけれど、それだと500を超える記事がリストから消えないことになり、後どれくらい残っているのかわからない。
スポンサードリンク
今回は複雑な作業を行う必要があるのだ。
今あるサイトがcasey.jp。ここにgeeklogと他のものがある。単独で移動できるものは移動済み。ただ、casey.jpからデータを抜いて空にして、www.casey.jp へ転送し別の内容を書きたい。また、casey.jpのgeeklogをgl.casey.jpに転送しようかとも思ったのだけど、geeklogはファイル量が膨大な上、URLやパスが変わると結構面倒な作業が必要だ。
casey.jpを空にするには手っ取り早いのだけどね。結局転送やら記事のコピーなんかをする労力を考えると、今回の方法がいいかなーと思ったわけで。
それから、SEO的にも良くない、というかもったいない。以外にアクセス数のあるページもあるのでWordPressに引っ越しても気にすることなく見て欲しい。んで、301リダイレクトをクローラに教えて、行き渡ったところでcasey.jpを消すか、www.casey.jp に転送して、.htaccessを参照させるようにしようかなと思う。これくらいの転送なら、厳しいほうのYahooさんも納得してくれるかな・・・とか思いつつ。
まぁ、雑に全アクセスを新しいWordPressのトップページへ転送してもいいけど、見てくれる人に面倒をかけてしまう。というか、私がそういったものに遭遇すると気分の良いものではないので。
さて、私情はこの辺にして取り掛かることにする。
手順としては結局手動になるのだけれど、次の手順を踏むことにした。
- geeklogの任意の記事を開き、内容をコピーする
- コピーした内容をWordPressに貼り付けて、保存する
- geeklogに戻り、該当する記事を「削除」する
(今までは「記事は移動しました」と書いてリンクを貼るだけだった) - geeklogへアクセスされたときに、WordPressのURLへ転送するように.htaccessに記載する
そして、もっともハマったのが.htaccessの記述。
まず、やりたいことは次の通り:
http://casey.jp/article.php?story=20091127034150115 (geeklog)に来たら、https://pc.casey.jp/?p=214 に301リダイレクトする。
で、テスト。静的ファイル:
http://casey.jp/test.html に来たら、http://www.yahoo.co.jp/ に行く。
Redirect permanent /test.html http://www.yahoo.co.jp/
これは難なくOK。で、ここからハマる。普通に考えると、
Redirect permanent /article.php?story=20091127034150115 http://www.yahoo.co.jp/
まぁ、うまくいかない。試行錯誤:
RewriteEngine on RewriteRule test.html http://www.yahoo.co.jp/ [L] RewriteRule article.php\?story\=20091127034150115 http://www.yahoo.co.jp/ [L] RedirectMatch (article.php\?story\=20091127034150115)$ http://www.yahoo.co.jp/ RedirectMatch ^article.php(\?story=20091127034150115)$ http://www.yahoo.co.jp/ RewriteRule ^(.*20091127034150115)$ http://www.new-example.com/$1 [R=301,L] RewriteEngine On RewriteCond %{REQUEST_URI} 20091127034150115 [L] RewriteRule ^(.*) http://www.yahoo.co.jp/
転送先に?とか付くのはOKらしいけど、転送元に?があったりするのはNGらしい。うーん。
そして、やっと神サイトを発見!光臨!
RewriteEngine on RewriteCond %{QUERY_STRING} 20091127034150115$ RewriteRule article.php http://www.yahoo.co.jp/ [NE,QSA,R=301,L]
で、できたー・・・。完全に合っているかはわからないけど、とりあえずここまでくれば何とかなりそう。
ちなみに、複数書く場合は以下のようにするらしい。引用:
リクエストの中の “
User-Agent:
” ヘッダにしたがって ホームページサイトの書き換えを行なうには、以下のようにします:RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/$ /homepage.max.html [L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L]解釈:ブラウザとして(自分自身で ‘Mozilla’ と名乗っている)ネット スケープナビゲータを使う場合、フレームなどを含む max の ホームページを見ることになります。(端末ベースの)Lynxブラウザを 使う場合は、画像やテーブルなどを含まない min のホーム ページが表示されます。それ以外のブラウザの場合は標準(std)のページ が表示されます。
結論
次のように変更すればよいと思われ:
RewriteEngine on #------------------------------------------------------------------------------ # geeklog downloads to wordpress #------------------------------------------------------------------------------ # from: http://casey.jp/filemgmt/visit.php?lid=7 # to : https://pc.casey.jp/wp-content/plugins/download-monitor/download.php?id=1 RewriteCond %{REQUEST_URI}%{QUERY_STRING} /filemgmt/visit.php?lid=[1-8] RewriteRule / https://pc.casey.jp/?page_id=428 [R=301,L] #------------------------------------------------------------------------------ # geeklog static pages to wordpress #------------------------------------------------------------------------------ # from: http://casey.jp/staticpages/index.php?page=20080221024111720 # to : http://diary.casey.jp/?page_id=50 RewriteCond %{QUERY_STRING} 20080221024111720 RewriteRule index.php http://diary.casey.jp/?page_id=50 [R=301,L] #------------------------------------------------------------------------------ # geeklog to wordpress #------------------------------------------------------------------------------ # from: http://casey.jp/article.php?story=20091127034150115 # to : https://pc.casey.jp/?p=24 RewriteCond %{QUERY_STRING} 20091127034150115 RewriteRule article.php https://pc.casey.jp/?p=249 [R=301,L] RewriteCond %{QUERY_STRING} 20081204183752432 RewriteRule article.php http://diary.casey.jp/?p=23 [R=301,L] #------------------------------------------------------------------------------ # geeklog to geeklog #------------------------------------------------------------------------------ # from: http://casey.jp/article.php?story=20090910213045272 # to : http://casey.jp/article.php?story=20090831235242762 RewriteCond %{QUERY_STRING} 20090910213045272 [OR] RewriteCond %{QUERY_STRING} 20090831235504272 [OR] RewriteCond %{QUERY_STRING} 20090830152902481 RewriteRule article.php http://casey.jp/article.php?story=20090831235242762 [R=301,L] RewriteCond %{QUERY_STRING} 2008012412564096 RewriteRule article.php http://casey.jp/article.php?story=20091104164245511 [R=301,L]
注意
- 最後に改行を付ける
- permanentは、永久的に移動したことを示すステータスを返します=301、つけないときは一時的な移動=302
- テスト用の転送先は自分で用意するんですよ。迷惑かけないようにね・・・。
参考文献
- HTTPリダイレクト Others .htaccess
- .htaccess – Rewrite
- mod_rewrite サンプル集/楽
- .htaccessでクエリ付きリダイレクト|独りスタンディングオベーション
- RewriteCond – RewriteRuleの条件を設定
- Apache module mod_rewrite
コメント