旧URLの受け皿はCMSの中に置く — ヘッドレスCMSのリダイレクトと404ログの実務
リニューアルで作った301の表は、公開した瞬間から古くなります。旧URLの受け皿をサーバー・エッジ・CMSのどこに置くか、EmDashの実装(スラッグ変更時の自動301・パターン・410)と、自サイトの404ログ1,211件の読み方を整理しました。
記事一覧の2/7ページ目です。

リニューアルで作った301の表は、公開した瞬間から古くなります。旧URLの受け皿をサーバー・エッジ・CMSのどこに置くか、EmDashの実装(スラッグ変更時の自動301・パターン・410)と、自サイトの404ログ1,211件の読み方を整理しました。

記事に付く「タグ」を、ただの文字列フィールドで持つか、CMSの分類機能(タクソノミー)で持つか。この選択が、一覧ページ・絞り込み・関連記事の実装を後から縛ります。自サイトの実績とブログで使い分けている実装を開きながら、着手前に決めたい4点を整理しました。

手元で動いたのに本番で崩れるのは、ヘッドレスCMS構成だとローカルと本番で土台が入れ替わるから。実行環境・DB・メディア・キャッシュの差、seedファイルの誤解、開発用バイパスの境界を、自サイトの設定と実装から整理しました。

EmDashのビジュアル編集は、テンプレートで印を付けた所だけが公開ページ上で直せます。型ごとのクリック時の動き、下書き保存と確認なしのPublish、本文の分割や飾り文字で壊れる3か所を、実装とローカル環境で確かめてまとめました。

EmDashのプラグインは、申告した権限しか持てないサンドボックス型と、サイト本体と同じ権限で動くネイティブ型の2種類。権限の仕組みと防げないこと、Cloudflareで有効にする条件、納品前に決めておく3点を実装者の視点でまとめました。

管理画面では新しいのに、クライアントの画面は古いまま。ヘッドレスCMS+Cloudflare構成で更新が止まるのは、ブラウザ・エッジ・オブジェクトキャッシュ・DBの4層のどれか。ヘッダーとServer-Timingで切り分ける手順と、層ごとの待ち時間の理屈を実測値つきでまとめます。

ヘッドレス構成でも画像は勝手に最適化されない。変換を通る画像と通らない画像の違い、変換が静かに止まる壊れ方、1年immutableだから「上げ直し」になる理由、消す前の確認まで。自分のブログを実際に直し、一覧12枚を578KBから78KBにした記録つき。

「公開日を過ぎたのにサイトマップに載らない」。予約投稿が効かない原因は管理画面ではなくインフラ側にありました。表示とサイトマップの判定のズレ、CloudflareでCron Triggerが要る理由、引き渡し前に見る3点を実装者目線で整理します。

「英語版も足せますか」と後から言われて慌てないために。EmDashとAstroのi18nを軸に、1言語=1行というデータの持ち方、既定言語にURL接頭辞を付けると管理画面が404になる罠、訳さない項目の決め方、未翻訳ページの扱いを実務目線で整理しました。

納品後に「項目が消えた」と連絡が来るのは、触れる場所まで渡してしまったから。EmDashの5段階ロールを軸に、公開権とスキーマ変更の境界、APIトークンやAIコネクタのスコープ、引き渡し前に決める4つを実務目線で整理しました。

納品後に飛んでくる「記事を消した」「前の版に戻したい」。ヘッドレスCMSの復元は下書き・リビジョン・ゴミ箱・データベースの4層に分かれ、戻せる範囲も期限も層ごとに違います。自サイト53記事の履歴件数、6週間前のゴミ箱、D1 Time Travelの守備範囲まで実測つきで整理しました。

記事が増えたのにサイト内検索が当たらない。原因は本文を索引にするときの区切り方で、既定は英語向けです。SQLite FTS5のトークナイザをtrigramに替えると日本語の途中一致を拾える。2文字以下が落ちる穴と、UIでの吸収まで実測つきで。