人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

301リダイレクト時のhtaccessの書き方について困っています。

ワードプレスからFC2ブログへ301リダイレクトをかけたいのですが、
エックスサーバーのワードプレスのpublic_htmlの中にhtaccessを置き、
下記のように書いたのですが404エラーになってしまいます。

どうしたら301リダイレクト出来るでしょうか。

ワードプレスのurlはhttp://example.jp/?p=記事番号
FC2ブログのurlはhttp://example.blog91.fc2.com/blog-entry-記事番号.htmlです。

記事番号は両方で合わせてあり、書いた内容は以下の通りです。
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule ^/?p=(.*)$ http://example.blog91.fc2.com/blog-entry-$1.html[R=301,L]
</IfModule>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
AddOutputFilterByType DEFLATE text/html text/css application/x-javascript application/javascript text/javascript

●質問者: ringomaru
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● oil999
●0ポイント

# BEGIN WordPress 以降に記述されている RewriteRule の文法が間違っています。
どのような転送を望んでいるのか分からないので、具体的な指摘はできません。


ringomaruさんのコメント
ご回答ありがとうございます。 # BEGIN WordPress 以降に記述されている部分はワードプレスで自動的に書き込まれた元々入っている.htaccessに記載されていた内容です。 この部分は消していいのか分からないため、そのまま残して上の部分に やりたい転送を追記しましたが消しても構いません。 実際に行いたいのは ワードプレス側の個別記事(http://example.jp/?p=記事番号)から FC2ブログ側の個別記事(http://example.blog91.fc2.com/blog-entry-記事番号.html)への転送です。 元々fc2ブログでブログをやっていたものをワードプレスへ移転したのですが、やはり元に戻したいのです。 一部の記事の検索結果が新ブログの方のアドレスに切り替わってしまっているので、 301リダイレクトで旧ブログの方に転送したいのです。

ringomaruさんのコメント
ちなみにトップページ以外はだんだんと検索結果が入れ替わっている感じで 新ブログにもアクセスがあるので、出来れば元のブログに301リダイレクトして、 新ブログの方はリダイレクトさえ出来れば削除したいと思っています。

2 ● rouge_2008
●200ポイント ベストアンサー

次のようにする事でリダイレクトします。(※2行追加)

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# 記事IDは数字なので、数字に限定する場合は次の行を「RewriteCond %{QUERY_STRING} ^p=([0-9]+)$」とします。
RewriteCond %{QUERY_STRING} ^p=(.+)$
RewriteRule ^$ http://example.blog91.fc2.com/blog-entry-%1.html? [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
AddOutputFilterByType DEFLATE text/html text/css application/x-javascript application/javascript text/javascript


http://blog.bumberboom.net/archives/monthly/2011_09/query-redirect.php

で、本題ですが、要は
(1) http://www.hoge.com/?page_id=1
のようなURLを
(2) http://www.hoge.com/fuga/
みたいなURLにリダイレクトする方法です。

?(略)?

RewriteCond %{QUERY_STRING} ^page_id=1$
RewriteRule ^$ /fuga/? [R=301,L]

「RewriteEngine On」の記述は既にWPが吐いているので必要ありません。
ポイントは2行目の「/fuga/」の後にある「?」です。
これをつけないと、クエリを引き継ごうとしてしまいます。



※301リダイレクトや404等を返すURLはインデックスしないはずですので、インデックスから消えた事と、アクセスするユーザーがいない事を(アクセス解析等で)確認したら、新ブログは削除してかまわないと思います。


ringomaruさんのコメント
rouge_2008様 ご回答ありがとうございます。 ご提示いただいた.htaccessの記述で希望の動きを実現できそうなのですが、 実はパーマリンクの設定でつまづいています。 ワードプレスで設定しているパーマリンクは記事タイトルがurlになるよう設定しています。 FC2ブログの方と対応させたのは http://example.jp/?p=記事番号の記事番号の部分ですが、それをワードプレスが自動的に <link href="http://example.jp/独自のスラッグ" rel="canonical">に変更しています。 【例】--------------------------------------- http://example.jp/?p=500にアクセスしたとする 自動でhttp://example.jp/hogehogeにリダイレクトされる。 グーグルにインデックスされているのは http://example.jp/hogehogeなので、アクセスしてくる人は http://example.jp/?p=500ではなくhttp://example.jp/hogehogeに アクセスしてくる。 ------------------------------------------ この場合はhttp://example.jp/hogehogeにアクセスしてきた人を http://example.jp/?p=500にリダイレクトさせ、これを http://example.blog91.fc2.com/blog-entry-記事番号.htmlにリダイレクトさせなくては、ダメでしょうか。

rouge_2008さんのコメント
そのケース(※投稿スラッグのみなどリダイレクト先で必要な記事IDを含まないURLへのリダイレクト)だと.htaccessによるリダイレクトはできませんので、「rel="canonical"」を試してみてください。 ・「header.php」の適切な位置(※タイトルタグの下など)に次のコードを記述します。 >|| <?php if( is_single() ) : ?> <link rel="canonical" href="http://example.blog91.fc2.com/blog-entry-<?php the_ID() ;?>.html" /> <?php endif; ?> ||< 「rel="canonical" 属性について」 http://support.google.com/webmasters/bin/answer.py?hl=ja&answer=139394 ※アクセスしてきたユーザーには、メッセージを表示して正しいURLを通知し、リンククリックで移動できるようにしておきます。 次のコードを記事タイトルの上の辺りに追加してみてください。 >|| <div class="message">この記事はURLが変更になっています。<br> <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>をクリックすると移動します。 </div> ||< ※デザインはCSSで変更します。(メッセージやクラス名は好みで変更してください。) ※「single.php」に記述する場合は、上記の記述を任意の箇所に追加するだけで大丈夫ですが、追加するテンプレートファイルによっては条件分岐が必要になります。 ※meta refreshを併用してもいいと思いますが、0秒指定は止めておいた方が良さそうです。(いきなり違うドメインにリダイレクトされると、アクセスしてきたユーザーの印象も悪くなるかもしれません。) 「301が使えない時のURL変更 〜 meta refresh 0秒とrel=“canonical”は併用できるか」 http://www.suzukikenichi.com/blog/can-i-use-zero-second-meta-refresh-and-rel-canonical-at-the-same-time/

rouge_2008さんのコメント
『そのケース(※投稿スラッグのみなどリダイレクト先で必要な記事IDを含まないURLからのリダイレクト)だと.htaccessによるリダイレクトはできませんので、「rel="canonical"」を試してみてください。』の間違いでした。 ×(誤) 記事IDを含まないURLへのリダイレクト ○(正) 記事IDを含まないURLからのリダイレクト ※今回追加した.htaccessの記述や以前設定済みの「rel="canonical"」(※前回の質問から)など、不要になった設定はすべて削除するのを忘れないでください。 インデックスへの反映には時間が掛かるようですので、じっくり待ってみてください。 ウェブマスターツールの「Fetch as Google」機能を利用して、クロールをリクエストすると、いくらか早くなるかもしれません。(※未検証) https://support.google.com/webmasters/bin/answer.py?hl=ja&answer=1352276&topic=2371374&ctx=topic

ringomaruさんのコメント
ご丁寧な回答をいただき誠にありがとうございます。 rel=canonicalはFC2ブログからワードプレスに移転する際に FC2ブログの方に設定したんですが、これが全く移転として グーグルに認識してもらえず、タイトルで検索すると いつまでもFC2ブログが上位に表示されるので、それだったら FC2ブログに戻った方がいいと思って今回の質問をしました。 ですので、rel=canonicalを使う方法は出来れば使いたくありません。 Fetch as Googleを使っても全く効果がなかったので・・・。 投稿スラッグのURLの正規表現を/?p=にして、それをリダイレクトすることは 出来ないでしょうか。 自分で出来もしないのに我儘なことばかり言っているのは承知しています。 本当に申し訳ありません。 今現在はWPのhead部分に以下のように出力されていて 投稿スラッグでアクセスしても?p=記事番号でアクセスしてもアクセスできるようになっています。 <link href="http://example.jp/?p=1842" rel="shortlink"> <link href="http://example.jp/hoge" rel="canonical"> これの正規表現を逆にしてFC2ブログにリダイレクトできれば、解決できるのですが、 WPのパーマリンク画面でパーマリンクをデフォルトに戻すと404エラーに なってしまい、個別ページが表示できなくなってしまいます。

rouge_2008さんのコメント
「rel=canonical」をFC2ブログに設定後、どのくらい経過しているのでしょう? 301リダイレクトの場合も、一度インデックスされたページの書き換えには時間が掛かる可能性があります。(比較・検証した事がありませんので不明です。) デフォルト設定の「/?p=***」は、パーマリンクを別の設定にしても有効なので、デフォルトのURLでアクセスした場合は有効なURLに自動でリダイレクトされますが、その他のパーマリンクは設定を変えるとアクセスできなくなります。 これはWordPressの仕様です。 ・「single.php」の「get_header()」より前に次の記述を追加してみてください。 >|| <?php $post_id = get_the_ID(); header("Status: 301 Moved Permanently"); header("Location: http://example.blog91.fc2.com/blog-entry-" . $post_id . ".html"); # この行より上に追加 get_header(); ?> ||< ※PHPの実行環境(「phpinfo()」を実行して「Server API」の項目を確認)を知らせてください。場合によってはHTTPヘッダーのレスポンスコードを変更する必要があります。)

ringomaruさんのコメント
何度も詳しいご回答をいただき、心より御礼申し上げます。 rel=canonicalとmeta refresh=10秒を旧ブログに設置したのは1/5です。 ただ、その後移転が進まなかったため何日か後に一度meta refresh=0秒にしたところ、 トップページが入れ替わったのですが、旧ブログのページランクが4から0に 変わってしまい、焦って10秒に戻したりしたという経緯があります。 10秒に戻したところ、旧ブログのページランクは元の戻り、 タイトルで検索すると旧ブログしか出てこない状態が15日ほど続いています。 ですが、つい先程タイトルで検索したところ旧ブログの下に新ブログも現れていました。 もしかしたら、FC2ブログに戻るか戻らないかを考えるのを、 もう少し待ったほうがいいのかもしれません。 もう少し様子を見てもダメなようなら、rouge_2008様にご提示いただいた記述をsingle.phpに追記してみようと思います。 ベストアンサーに選ばせて頂きたいと思っていますが、 もう少しサイトの移行状況を待ちたいと思いますので、 質問終了をもう少し後にさせてください。 宜しくお願いいたします。

rouge_2008さんのコメント
「single.php」に追加するコードを次のように変更してみてください。 ※ヘッダーの送信をWordPressの関数に任せる事にします。(PHPの実行環境は不要になりました。) >|| <?php $post_id = get_the_ID(); $location = 'http://example.blog91.fc2.com/blog-entry-' . $post_id . '.html'; wp_redirect($location, 301); exit; # この行より上に追加 get_header(); ?> ||<

rouge_2008さんのコメント
インデックスの反映状況をもう少し見てから試したいという事ですね。 短期間に変更しすぎると悪影響があるかもしれませんし、その方がいいかもしれませんね。 ※質問の有効期間は最長でも1週間ですので、2月4日までに手動での終了をお願いします。 ※「rel=canonical」を利用した場合に、ユーザーがリンククリックで新しいURLに移動できるようにメッセージを表示させるコードのリンクURLに間違いがありました。(不要になったコードですが、一応訂正したコードを残します・・・) >|| <div class="message">この記事はURLが変更になっています。<br> <a href="http://example.blog91.fc2.com/blog-entry-<?php the_ID() ;?>.html"><?php the_title(); ?></a>をクリックすると移動します。 </div> ||<

ringomaruさんのコメント
2/4までには確実に手動終了させていただきます。 とても感謝しているので、別途はてなポイントをお送りしたかったのですが今はポイントを送れないようになっているみたいですね・・・。

ringomaruさんのコメント
何度も何度も申し訳ありません。 やはり性格上、移転を眺めている余裕がありません。 ですので、やはり移転を元に戻します。 そこでsingle.phpに教えていただいた下記を記述したのですが、 個別ページが真っ白になってしまったため元に戻しました。 どうすれば宜しいでしょうか。 exampleはもちろん自分のドメインに変えて記述しました。 <?php $post_id = get_the_ID(); $location = 'http://example.blog91.fc2.com/blog-entry-' . $post_id . '.html'; wp_redirect($location, 301); exit;

ringomaruさんのコメント
すみません!解決しました。 教えていただいたsingle.phpに書く方法でうまく行ったのですが、 これだけで301リダイレクト(移転)している状態ということで宜しいですか? .htaccessには何も書かなくて大丈夫でしょうか。

rouge_2008さんのコメント
個別投稿ページにアクセスして、リダイレクトされる事を確認してみてください。(.htaccessへの記述追加はありません。) (※Google Chromeの場合、ブラウザに付属している開発者ツールでステータスコードを確認できます。「設定」ボタン→「ツール」→「デベロッパーツール」を実行し、「Network」タブを表示してからページを読み込みます。IE8以降にも開発者ツールは付属しています。「ツール」ボタン→「開発者ツール」を実行後、「ネットワークタブ」を表示して、「キャプチャの開始」をクリックしてからページを読み込みます。)

ringomaruさんのコメント
Chromeで確認したところWPの記事は301を吐き出していて、FC2ブログの方は200であることを確認できました。 上手く移転できているようです。本当にありがとうございます!! しかもFC2ブログの方のcanonical設定を消したら、すぐにアクセスが元記事の方に移行しました。 ということはcanonicalは移転にうまく働くということですね。 私がゴチャゴチャとmetaの秒数を変えたりしたことで、移転がうまく行かなかったようです。 今度は移転ではなく、WPで一から作り直そうと思います。 沢山の知識を駆使していただき本当に感謝しております。 これで質問を終了いたします。

ringomaruさんのコメント
あとでこのはてなを参考にする人に勘違いさせると困るので、追記しておきます。 すぐにアクセスが元記事の方に移行したと書きましたが、301リダイレクトで 来ているだけでした(^_^;) 301リダイレクトだとアクセス解析に移転元は表示されないんですね。 失礼しました!!

rouge_2008さんのコメント
ポイントとベストアンサーありがとうございました。 > 301リダイレクトだとアクセス解析に移転元は表示されないんですね。 アクセス解析の機能によるかもしれませんが、リファラーの方に記録されていないでしょうか?

ringomaruさんのコメント
私はグーグルアナリティクスとQLOOKアクセス解析を使っています。 グーグルアナリティクスにはリファラーという項目がありましたが、 一ページずつ確認しないと、参照元がWPの方なのか確認できませんでした。 もっと簡単に確認できる方法はありますか? 質問を閉じているのに図々しいですがお分かりでしたら、ご紹介いただけると幸いです。

rouge_2008さんのコメント
※誤字訂正と追記をしてサイドコメントしています。 > 一ページずつ確認しないと、参照元がWPの方なのか確認できませんでした。 リダイレクトの場合、やはり移転元は表示されないのかもしれませんね。 はてなカウンター(※有料サービス)の場合、「サイトトップ」→「リダイレクトするページ」→「移転先」でアクセスした場合に「サイトトップ」が、「サイトトップ」→「アーカイブ」→「リダイレクトするページ」→「移転先」でアクセスした場合には「アーカイブ」のURLが記録されましたので、ステータス200で正常に表示されるページが記録される仕組みに見えます。 ※「ログ」で1ページずつ、サイト全体では「リンク元」で確認できる仕様です。 グーグルアナリティクスは使用していないので分かりませんが、検索結果のページ(※移転先ではなく移転元だけが結果に表示されるページ)の記録がないでしょうか? リファラーの項目に移転元のWordPressのURLが記録されているページは、サイト内移動をしてからリダイレクトされるページにアクセスしたのかもしれません。(※アクセスが記録された(※移転先の)ページと対になるURLでしたか?トップページやアーカイブなど、おそらく別のページのURLではないかと思うのですが・・・) グーグルアナリティクスやその他の解析サービスも、リファラー(リンク元)の確認については、はてなカウンターと同様の仕組みかもしれません。 リダイレクト元を除外せず記録するアクセス解析については心当たりがありません。 ※追記 既に対策済みかもしれませんが、今後はWordPressのサイトがインデックスされないように、メタタグで「noindex」等を指定するなど、何か対処しておいた方がいいかもしれませんね。

3 ● pretaroe
●0ポイント


Wordpressのリダイレクトプラグイン
http://downloads.wordpress.org/plugin/redirection.zip

を導入して、その中で設定するほうが楽だと思います。
正規表現もOKです。

使い方も検索すれば出てくるかと思います。

ドメインが違うところへも転送できます。


ringomaruさんのコメント
ご回答ありがとうございます。 残念ながらワードプレス3.50では使えないプラグインのようです。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ