サブドメイン移行でブログ全体をリダイレクトしてしまった話|Next.jsのredirectsでやらかしたSEO移行ミス
Next.jsで一部の記事だけをサブドメインへ移行するつもりが、ワイルドカード指定によってブログ全体をリダイレクトしてしまった実例。原因と修正方法、移行時に確認するポイントをまとめます。
ABCクッキングに関する情報をまとめていたコンテンツを、うにラボ本体のサイトから専門サイトへ移すことにしました。
移行先は、
abc.uni-lab.jp
です。
もともとうにラボ本体の /blog 配下にあったABC関連の記事だけを、新しい専門サイトへリダイレクトする予定でした。
ところが設定を間違えて、ABCとは関係ないブログ記事やブログ一覧まで、まとめてABCサイトへ転送される状態になってしまいました。
今回は、そのとき何を間違えて、どう直したのかをまとめます。
やりたかったこと
もともと、うにラボ本体にはABCクッキング関連の記事がいくつかありました。
ただ、ABC関連のコンテンツが増えてきたため、
- うにラボ本体:開発・AI・業務改善などの実務コンテンツ
abc.uni-lab.jp:ABCクッキング専門メディア
という形に分けることにしました。
そこで必要になったのが、旧URLから新URLへのリダイレクトです。
たとえば、
uni-lab.jp/blog/lesson-cancel-fee-guide
にアクセスした人を、
abc.uni-lab.jp/blog/lesson-cancel-fee-guide
へ移動させるイメージです。
ここまでは普通のサイト移行です。
最初に設定していたリダイレクト
Next.jsの next.config.ts で、当初は /blog 配下をまとめて転送するような設定にしていました。
考え方としては、
「ABCの記事は /blog にあるんだから、まとめて新サイトへ送ればいい」
というものです。
ところが、これがまずかったです。
/blog/:slug*
のような広い条件でリダイレクトすると、ABCの記事だけではありません。
/blog/blog/category/blog/category/xxx- ABCとは関係ない記事
まで対象になります。
結果、うにラボ本体のブログそのものがABCサイトへ飛ばされる状態になりました。
なぜ気づきにくかったのか
原因自体は単純なのですが、サイト移行中は少し気づきにくい問題でした。
ABCの記事を確認すると、正しく新しいサイトへ飛びます。
なので一見、
「リダイレクトできている」
ように見えます。
でも実際には、対象範囲が広すぎました。
必要だった確認は、
「転送したいURLが転送されるか」だけではなく、「転送したくないURLが残っているか」
でした。
これは今回かなり重要だったポイントです。
ワイルドカードをやめて、対象記事を明示した
最終的には、 /blog/:slug* のような一括リダイレクトをやめました。
代わりに、旧うにラボ側に存在していたABC関連記事だけを明示的に指定しています。
対象にしたのは10記事です。
たとえば、
- lesson-reservation-rules
- expiry-after-deadline-guide
- lesson-cancel-fee-guide
- student-discount-conditions-guide
- membership-eligibility-guide
- mothers-service-application-guide
などです。
これらだけを、
https://abc.uni-lab.jp/blog/同じslug
へリダイレクトするよう変更しました。
記事以外にも、ABC専用だった料金ページやキャンペーンページなどは個別に転送しています。
「たぶんABCの記事」を全部飛ばすのをやめた
今回もうひとつ意識したのが、移行対象を推測で増やさないことです。
Gitの履歴も確認し、旧サイト側でABCの記事として実際に扱っていた記事を確認しました。
その結果、今回リダイレクト対象として確実に確認できた旧記事は10件でした。
「昔もっと記事があった気がする」
という記憶だけで大量のURLを追加するのではなく、確認できたものだけを対象にしています。
サイト移行では、リダイレクト漏れも問題ですが、関係ないURLを別サイトへ飛ばしてしまうのも同じくらい問題です。
デプロイ前後の確認にも注意が必要だった
修正後にも少し混乱がありました。
コードを直した直後に公開サイトを確認すると、まだ /blog がリダイレクトされていました。
最初は、
「修正できていない?」
と思ったのですが、原因は単純で、AWS Amplifyのデプロイがまだ完了していませんでした。
数分後に再確認すると、
/blog→ うにラボ側で正常表示- ABC旧記事 →
abc.uni-lab.jpへリダイレクト
という意図した状態になりました。
コード変更直後の確認では、今見ているものが最新デプロイなのかも確認する必要があります。
今回の失敗から変えた確認方法
この失敗以降、リダイレクトを変更するときは最低でも次の3種類を見るようにしました。
-
移行対象URL → 新URLへ正しくリダイレクトされるか
-
移行対象ではないURL → 元サイトにそのまま残っているか
-
一覧・カテゴリなどの親URL → 意図せずリダイレクト対象になっていないか
特に2番が重要でした。
正常系だけ確認すると、今回のような設定でも「成功したように見える」からです。
ワイルドカードが悪いわけではない
今回の原因は、ワイルドカードそのものではありません。
同じディレクトリ配下を本当に丸ごと移行するのであれば、
/blog/:slug*
のような指定は合理的です。
問題だったのは、
同じ /blog の中に「移行する記事」と「残す記事」が混在していたこと
です。
この状態でディレクトリ単位のルールを設定すると、対象を広く取りすぎます。
今回のケースでは、多少設定が長くなっても個別指定の方が安全でした。
SEO移行は「正しく飛ぶ」だけでは足りない
今回の作業で一番印象に残ったのは、
リダイレクトの確認は「正しく飛ぶか」だけでは不十分
ということでした。
特に複数テーマを扱っていたサイトから、一部のコンテンツだけを専門サイトへ切り出す場合、
- 何を移すのか
- 何を残すのか
- どのURL単位でルールを書くのか
を先に整理しないと、簡単に対象範囲を間違えます。
今回のうにラボでは、ABCクッキング関連だけを abc.uni-lab.jp へ分離し、親サイトの /blog は「うにラボ実務ノート」として残す形に整理しました。
実装としては小さな修正でしたが、サイト構造とリダイレクト条件を一致させることの重要性がよく分かった失敗でした。
