Worpdressで書いていたブログを整理・統合しようと思って、htaccessによるクエリ文字列のリダイレクトでつまづいたのでメモ。
発端:ブログの整理整頓・統合でhtaccessのリダイレクトを設定
さくらサーバーで管理していたブログAの記事を、記事の内容ごとにブログBとブログCに移行しようとしていた時の話。ブログAは数年前に何も考えずに作ったので、パーマリンクが初期設定のまま(クエリ文字列)だった。実際に以下のような感じのURLだった。
例)ブログAの記事URL
https://blog-a.com/?p=3
https://blog-a.com/?p=10
https://blog-a.com/?p=17
この1記事目と2記事目をブログB、3記事目をブログCにそれぞれ移行(リダイレクト)しようと思った。
例)ブログAからの記事移行予定
https://blog-a.com/?p=3
→ https://blog-b.com/article01/
https://blog-a.com/?p=10
→ https://blog-b.com/article02/
https://blog-a.com/?p=17
→ https://blog-c.com/article01/
通常のhtaccessでリダイレクトするも失敗
そこで、まずは何も考えずにhtaccessリダイレクト。
通常のリダイレクトであれば、以下のような形になる。
# ページごとのリダイレクトの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule リダイレクト元のURL リダイレクト先のURL [R=301,L] </IfModule>
上記の例でいう?p=3と?p=10をブログBの/article01/と/article02/へ、?p=17をブログCの/article01/へ移行しようと思っていたので以下の用に記述。
# ページごとのリダイレクトの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ?p=3 https://blog-b.com/article01/ [R=301,L] RewriteRule ?p=10 https://blog-b.com/article02/ [R=301,L] RewriteRule ?p=17 https://blog-c.com/article01/ [R=301,L] </IfModule>
結果、
なんでやねん・・・。
んー、記述が間違ってるのかな、と思って、1URLずつやろうと思い、以下のように元URLの方を書き直していろいろ試してみるけどうまくいかない。
# ページごとのリダイレクトの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^?p=3 https://blog-b.com/article01/ [R=301,L] </IfModule>
# ページごとのリダイレクトの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^?p=3$ https://blog-b.com/article01/ [R=301,L] </IfModule>
さくらサーバーの問題かなぁと思っていろいろ調べるけど、別段特殊な事情もなさそうだった。
原因はクエリ文字列だった
で、いろいろ調べた結果、はてなの人力検索でとてもわかり易く今回の事例に当てはまる記述があり、解決できました。
クエリー文字列が含まれるURLを.htaccessでリダイレクトしたい – 人力検索はてな
http://q.hatena.ne.jp/1341680846
これによると、
リダイレクトの設定はRewiteRuleで行うものですが、RewriteRuleではクエリ文字列を条件にできないのでRewriteCondと合わせて使います。
だそうで。全然知らんかった・・・。
クエリ文字列を含んだページごとのhtaccessリダイレクトの正しい記述
というわけで、元URLにクエリ文字列(パラメータ)を含む場合のhtacdessリダイレクトは以下のような感じでできました。
# ページごとのリダイレクトの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} (^|&)p=3(&|$) RewriteRule ^/?$ https://blog-b/article01/? [R=301,L] RewriteCond %{QUERY_STRING} (^|&)p=10(&|$) RewriteRule ^/?$ https://blog-b/article02/? [R=301,L] RewriteCond %{QUERY_STRING} (^|&)p=17(&|$) RewriteRule ^/?$ https://blog-c/article01/? [R=301,L] </IfModule>
参考URL
クエリー文字列が含まれるURLを.htaccessでリダイレクトしたい – 人力検索はてな
http://q.hatena.ne.jp/1341680846
→ページ単位でリダイレクトさせたい場合に単純に1番わかりやすかった。
mod_rewriteでクエリ文字列(/?q=)を引き継がずにURL置換 -ええかげんブログ(本店)
http://algorhythnn.jp/blg/url-redirect/rewriterule/mod_rewrite-del-query/
→クエリ文字列のリダイレクトについてもう少し突っ込んだ記事。非常にわかりやすい。
コメント