[{"data":1,"prerenderedAt":288},["ShallowReactive",2],{"content-/wordpress-cutover-phase4":3,"all-pages-for-dir":268,"related-/wordpress-cutover-phase4":269,"og-image-/wordpress-cutover-phase4":287},{"id":4,"title":5,"body":6,"category":248,"concepts":249,"description":250,"extension":251,"meta":252,"navigation":253,"ogImage":249,"path":254,"project_name":255,"published":256,"publishedAt":257,"seo":258,"stem":259,"tags":260,"todo":249,"unpublished":256,"updatedAt":249,"__hash__":267},"pages/2026-07/2026-07-26/wordpress-cutover-phase4.md","WordPressサイトの本番DNS切替と、移行後に見つかった301の穴",{"type":7,"value":8,"toc":235},"minimark",[9,13,16,21,24,27,30,33,36,39,60,65,68,75,78,82,85,88,91,94,97,100,104,107,110,113,116,119,129,132,135,138,141,144,148,151,154,157,160,163,167,170,181,184,187,190,193,196,199,202],[10,11,12],"p",{},"切替の当日は、意外と何も起きない。",[10,14,15],{},"前のフェーズまでで新サイト側の準備は済んでいて、残っていたのは向き先を変える操作だけだった。だから怖いのは切替そのものではなく、切り替えたあとに「実は通っていなかったURL」が静かに残ることのほうだ。案の定、静かに残っていた。",[17,18,20],"h2",{"id":19},"www-をゾーンに入れてapex-の301を実測するまで","www をゾーンに入れて、apex の301を実測するまで",[10,22,23],{},"まず進捗台帳と切替手順書を Claude Code に読ませて、Step 1 の実行内容を確定させた。ここを曖昧なまま触ると、あとで「何をやった状態なのか」が分からなくなる。",[10,25,26],{},"管理画面の操作はブラウザ越しに進めた。途中でログインページに飛ばされたり、ページの状態がスクリーンショットとテキストで食い違ったりして、そのたびに「今どの画面にいるか」をテキストで取り直してもらった。接続しているブラウザが1台だけであることも確認した。複数繋がっていると、操作した先と見ている先がずれる。",[10,28,29],{},"www 付きのサブドメインをゾーンに入れて続行すると、DNS確認画面に進んだ。リダイレクトのルールを作ろうとしたらカスタムフィルタ式のビルダーが出てきたので、GUIで積み木を並べるのはやめて、式を直接編集するモードで書いてもらった。1行の式にしておけば、あとから読み返して条件を確かめられる。",[10,31,32],{},"ルールがアクティブになったところで、apex から www への301を実測した。ここまでは想定どおり。",[17,34,35],{"id":35},"切替直後にひととおり殴ってみる",[10,37,38],{},"「たぶん大丈夫」は検証ではないので、切替直後に総当たりをかけた。",[40,41,42,46,49,57],"ul",{},[43,44,45],"li",{},"203記事の本番URL全件 → すべて200",[43,47,48],{},"301で寄せる対象の7記事と、ルール13本 → すべて最終的に200へ到達",[43,50,51,52,56],{},"WordPress時代の ",[53,54,55],"code",{},"?p={ID}"," 形式 210件 → 本番ドメインで巡回",[43,58,59],{},"sitemap と noindex の状態",[10,61,62,64],{},[53,63,55],{}," は旧サイトが吐いていた素のパーマリンク形式で、外部からのリンクやブックマークがここに残っている。新サイト側で受け止められないと、そのまま行き止まりになる。",[10,66,67],{},"画像も1枚ずつ突き合わせた。最初の巡回で欠けが出て、キャッシュをパージしたら71/72枚まで戻った。残り1枚のSVGだけが戻らないので、そこは個別に追いかけた。検証の途中でブラウザのタブが閉じられていて、新しいタブで開き直して再検証した場面もある。「さっき見たときは出ていた」は根拠にならない。",[10,69,70,71,74],{},"robots.txt を新しく作り、ビルド→sitemap生成→デプロイの順で流した。ついでに旧サーバー関連の作業メモが公開側に出ていないかを確認したところ、",[53,72,73],{},"draft: true"," が効いて dist にそもそも生成されておらず、本番では404だった。露出なし。",[10,76,77],{},"デプロイ直後は、デプロイ固有URLと本番エイリアスの両方を叩いて切り分けた。片方だけ見ていると、「デプロイは成功したのに本番には出ていない」を見逃す。",[17,79,81],{"id":80},"search-console-にサイトマップを出し直す","Search Console にサイトマップを出し直す",[10,83,84],{},"サイトマップの再送信は、プロパティ未選択の画面に飛ばされるところから始まった。登録済みプロパティの一覧が空に見えたので、スクリーンショットで実際の表示を確認してもらった。DOMのテキストだけ見ていると、描画されているのに拾えていないケースがある。",[10,86,87],{},"送信は成功して、送信日が 2026/07/26 に更新された。ページレポートでインデックスの初期状況も記録した。サイトを一度落としているので、ここの数字は今日が底になるはずだ。",[10,89,90],{},"学習ゲートを通そうとしたが、今日はスキップして先に進めることにした。",[17,92,93],{"id":93},"セッション上限で一度止まる",[10,95,96],{},"上位ページの確認に入ったところでセッション上限に当たり、正午過ぎまで待たされた。裏で走らせていたレビュー用のワークフローも、記事メタの6バッチは完了していたが、専門レビュー3件だけが上限で落ちていた。",[10,98,99],{},"再開後は Opus 5 に切り替わっていたので、失敗した3件だけを再実行した。完了済みの分はキャッシュを再利用させたので、やり直しは3件分で済んだ。全部投げ直していたら、また上限まで走らされていたと思う。",[17,101,103],{"id":102},"全部うまくいったのかを確かめに行ったら穴が出た","「全部うまくいったのか」を確かめに行ったら、穴が出た",[10,105,106],{},"検索コンソールに記録のある上位ページが、新サイトでちゃんと表示されるか。まず上位10ページのHTTP状態を確認した。全件正常。",[10,108,109],{},"ただ、上位10件で「全部うまくいっている」と言い切るのは無理がある。記録のある全222ページ（203記事以外の旧URLを含む）を取り出して突き合わせにかかった。ここで手が止まる。表示件数を500行に切り替えても、UIに反映されない。何度やっても同じだった。",[10,111,112],{},"一覧が取れないなら、URLの形から攻めればいい。旧WordPress特有のURL体系——カテゴリ、タグ、フィード——が新サイトでどう扱われるかを直接テストした。",[10,114,115],{},"旧カテゴリの階層URLが404を返した。",[10,117,118],{},"台帳には301実装済みと書いてある。ならばルールの条件のほうが実際のURLとずれている。末尾スラッシュの有無で切り分けたら、そのとおりだった。",[120,121,126],"pre",{"className":122,"code":124,"language":125},[123],"language-text","/category/parent/child   → 301（効く）\n/category/parent/child/  → 404（効かない）\n","text",[53,127,124],{"__ignoreMap":128},"",[10,130,131],{},"WordPressが実際に吐いていたのはスラッシュ付きのほう。しかも新サイト側はスラッシュ付きが正規URLだ。つまり、旧サイトが世に出していた形のカテゴリURLだけが、まるごと落ちていた。",[10,133,134],{},"移行の欠陥としては1件。ただ、これを見つけるまでの経路が「上位10件OK → 全件見ようとしてUIに阻まれる → URLの形から攻める」だったのが今日のいちばんの収穫だった。一覧が取れないことに詰まっていたら、この穴は見つかっていない。",[17,136,137],{"id":137},"待ち時間にフォームを触っておく",[10,139,140],{},"修正の検証用に wrangler dev を起こしている間、手が空く。その間に本番ドメインでお問い合わせフォームを開いた。認証ウィジェットのホスト名設定に www 付きが入っていないと、切替後にフォームだけ静かに死ぬ。",[10,142,143],{},"開いてみたら、ウィジェットは www 付きでも正常に表示された。ここは無傷。",[17,145,147],{"id":146},"修正そしてエッジ伝播に騙されかける","修正、そしてエッジ伝播に騙されかける",[10,149,150],{},"wrangler dev が上がってから、階層カテゴリのルールを直してローカルで検証した。スラッシュ付きが301になること、単一階層のカテゴリが壊れていないこと。リグレッションを確認してからデプロイした。",[10,152,153],{},"デプロイ後に本番を叩いたら、2つ引っかかった。片方は直したはずの階層カテゴリがまだ404を返す。もう片方は日本語slugのURLが通らない。",[10,155,156],{},"どちらも実際の欠陥ではなかった。",[10,158,159],{},"階層カテゴリのほうはエッジ伝播の過渡状態で、時間をおいて3回叩いたら3回とも301になった。日本語slugはURLエンコードして投げれば200で、素の日本語をそのまま渡していた curl 側の問題だった。「デプロイ直後の1回の結果を確定情報として扱わない」を、今日2回学んだことになる。",[10,161,162],{},"切り分けの結果は台帳に書いてコミットした。「404だったが伝播の過渡状態」「日本語slugはエンコード漏れ」まで残しておかないと、記録上は欠陥2件が未解決のまま残る。",[17,164,166],{"id":165},"_1週間2週間1ヶ月のモニタリングを台帳に書く","1週間・2週間・1ヶ月のモニタリングを台帳に書く",[10,168,169],{},"移行の途中でサイトが一度落ちている。インデックスは減っているし、直近のアクセス数もかなり少ない。切替直後の数字を見て一喜一憂しても仕方がないので、観測の期間と見る対象を先に決めて移行計画の台帳に書き足した。",[40,171,172,175,178],{},[43,173,174],{},"1週間：インデックス数が増える方向に向いているか、404が出ていないか",[43,176,177],{},"2週間：上位ページの表示とアクセスが戻り始めているか",[43,179,180],{},"1ヶ月：全体として上がっていく形になっているか",[10,182,183],{},"旧サーバーをいつ解約するかも、この観測結果とセットで判断することにした。まだ切らない。301が効いている前提が崩れたときに戻れる場所を、しばらく残しておく。",[10,185,186],{},"なお、タイトルとディスクリプションの一貫性——いわゆるAI SEOまで含めた改善方針については、この日別のレビューと計画立案を並行して走らせている。そちらは別の記事に分けた。",[17,188,189],{"id":189},"走らせっぱなしのプロセスを片付ける",[10,191,192],{},"今日の作業を終える前に、動いているものがないかを確認した。",[10,194,195],{},"wrangler dev の残骸が1つ残っていたので、ポート指定で止めた。ポートは解放されたのに workerd プロセスが3つ残っていて、素性を確認させたら2つは別プロジェクトのものだった。触らない。自分が今日起動した1つだけを止めた。",[10,197,198],{},"プロセス名だけ見て一括で殺すと、隣のプロジェクトを巻き込む。名前ではなく素性で判断する、という当たり前の作法を毎回やる。",[17,200,201],{"id":201},"今日の学び",[40,203,204,211,217,223,229],{},[43,205,206,210],{},[207,208,209],"strong",{},"「上位10件が通った」は「全部通った」ではない。"," 上位だけの確認で止めていたら、旧カテゴリURLの穴はそのまま残っていた",[43,212,213,216],{},[207,214,215],{},"一覧が取れないときは、URLの形から攻める。"," 管理画面のUIが言うことを聞かない時点で諦めず、旧CMS特有のURL体系を列挙してテストするほうが速かった",[43,218,219,222],{},[207,220,221],{},"末尾スラッシュは移行の鬼門。"," 旧サイトが実際に出していた形と、新サイトの正規形と、リダイレクトルールの条件——この3つが一致しているかを、形ごとに叩いて確かめる",[43,224,225,228],{},[207,226,227],{},"デプロイ直後の1回の結果を信じない。"," 404も200も、エッジの伝播が落ち着くまでは過渡状態を見ている可能性がある",[43,230,231,234],{},[207,232,233],{},"切り分けの結果は台帳に残す。"," 「これはcurl側の問題だった」を書いておかないと、次に同じ404を見たときにまた同じ切り分けを一からやることになる",{"title":128,"searchDepth":236,"depth":236,"links":237},2,[238,239,240,241,242,243,244,245,246,247],{"id":19,"depth":236,"text":20},{"id":35,"depth":236,"text":35},{"id":80,"depth":236,"text":81},{"id":93,"depth":236,"text":93},{"id":102,"depth":236,"text":103},{"id":137,"depth":236,"text":137},{"id":146,"depth":236,"text":147},{"id":165,"depth":236,"text":166},{"id":189,"depth":236,"text":189},{"id":201,"depth":236,"text":201},"dev",null,"WordPressから移してきた会社サイトの本番DNSを切り替えた。203記事の200確認はすんなり通ったのに、旧カテゴリURLに末尾スラッシュを足した瞬間404が出た。検証・修正と1ヶ月分のモニタリング設計まで。","md",{},true,"/wordpress-cutover-phase4","eurekapu",false,"2026-07-26T00:00:00.000Z",{"title":5,"description":250},"2026-07/2026-07-26/wordpress-cutover-phase4",[261,262,263,264,265,266],"WordPress移行","Cloudflare","DNS切替","301リダイレクト","Search Console","モニタリング","abXxlG7C5SlKjKA1DmwPDm44Z1DZasFlEr0Hp-qiKEo",[],[270,274,277,281,284],{"title":271,"path":272,"publishedAt":273},"2026年7月27日の開発日記 - 画像3,810件の配信復旧とHeroku停止の実測","/2026-07-27-diary","2026-07-27T00:00:00.000Z",{"title":275,"path":276,"publishedAt":257},"2026年7月26日の開発日記 - WordPressサイトをついに本番切替した日","/2026-07-26-diary",{"title":278,"path":279,"publishedAt":280},"Herokuを止める前に導線を移す — app.eurekapu.com 静的化の本番切替とUdemyリンク62本の移設","/app-cutover-udemy-links-finish","2026-07-28T00:00:00.000Z",{"title":282,"path":283,"publishedAt":280},"Search Console を調べ直したら「伸びていない」が「4割落ちていた」に変わった — 日記の noindex 提案に待ったをかけた日","/gsc-review-noindex-rethink",{"title":285,"path":286,"publishedAt":273},"Notion 9,375ページの移行先を設計し直す — 原本243MBの抜けと、Markdown→Googleドキュメント変換の実測","/notion-archive-migration-google-docs","https://log.eurekapu.com/og/blog/wordpress-cutover-phase4.png?v=2026-07-26T00%3A00%3A00.000Z&title=WordPress%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E6%9C%AC%E7%95%AADNS%E5%88%87%E6%9B%BF%E3%81%A8%E3%80%81%E7%A7%BB%E8%A1%8C%E5%BE%8C%E3%81%AB%E8%A6%8B%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%9F301%E3%81%AE%E7%A9%B4&author=Kei%20Komatsu&sig=96dfd1ff7fed45e2",1785379945941]