◉ANTIGRAVITY LABEN
記事一覧/アプリ開発
▣ アプリ開発/2026-11-12上級

Web フォントの配信確認は Origin ヘッダ付きの curl でも行う:代替書体のまま 13 日間気づかなかった記録

自分のサイトで欧文フォントだけが 13 日間 404 のまま、代替書体で描かれていました。素の curl は 200 を返し、ブラウザが送る Origin 付きの要求だけが古い 404 を受け取っていたためです。3 通りの要求を並べる確認スクリプト、エラー応答に長期キャッシュを乗せない設定、変種まで届くパージの選び方を書き残します。

WebフォントCloudflare7CORSキャッシュ4curl個人開発125Antigravity414

✦ プレミアム記事

9 月 25 日、自分のポートフォリオサイトの表示を見直していて、DevTools のコンソールで document.fonts を開きました。並んだ書体のうち、欧文用に自前で配信している一つだけが status: "error" になっておりました。

ところが、同じフォント URL を手元の curl で取ると、返ってくるのは 200 です。ファイルは確かにサーバーにあり、中身のバイト数も合っています。「サーバーは正しいのに、ブラウザだけが失敗している」——この食い違いの正体を突き止めるまでに、実は 13 日が過ぎていました。

個人開発で Web サイトを自分で運用していると、配信の確認はつい「curl で 200 が返ったから大丈夫」で済ませてしまいます。私自身がまさにそうでした。以下では、そのとき起きていたこと、確認のしかたをどう変えたか、そして二度と同じ形で踏まないために入れた設定を、実際に使っている形でお伝えします。

最初にお伝えしたいこと

素の curl が返す 200 は、ブラウザがフォントとして受け取る応答の証明になりません。

ブラウザは Web フォントを CORS で取りに行くため、要求に Origin ヘッダが付きます。私の環境では、CDN(Cloudflare)が Origin 付きの応答を素の応答とは別に保持しており、その Origin 付きの側にだけ、古い 404 が残っていました。素の curl は Origin を付けないので、正しいほうの応答しか見えなかったのです。

確認は「素の要求」「Origin 付きの要求」「キャッシュを避けた要求」の 3 通りを並べて行います。これがこの記事のいちばんの持ち帰りです。

13 日間に起きていたこと

時系列で並べると、次のようになります。日付はいずれも私の作業記録からです。

日付起きたことそのとき見えていたもの
9 月 12 日Google Fonts で読んでいた欧文書体を、サブセット化して自前配信に切り替えた表示は崩れず、切り替えは成功したと判断
9 月 12 日〜全ページで、その書体の代わりに OS の代替書体(Helvetica)が描かれていた見た目の差がわずかで、私も気づかなかった
9 月 25 日document.fonts で status: "error" を確認素の curl は 200・正しいバイト数
9 月 25 日Origin を付けた curl で 404 を確認し、プレフィックス指定のパージで解消3 通りの要求がそろって 200 に

代替書体は、メトリクスを合わせた設定を入れていたこともあり、ぱっと見では区別がつきませんでした。レイアウトも崩れません。だからこそ 13 日も気づけなかったのだと思います。見た目が壊れない不具合は、壊れる不具合よりも長く残ります。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦新しいフォントや画像を公開した直後に、素の要求・Origin 付き・キャッシュ回避の 3 通りを数十秒で並べ、ブラウザが本当に受け取る応答を確かめられるようになります
✦アップロード前に一度叩かれた URL の 404 が 1 年残る事故を、エラー応答だけ保存させない 1 行の設定で、起きる前に防げるようになります
✦パージしたのに直らないとき、URL 指定・headers 付き指定・プレフィックス指定のどれを使えば変種まで消えるかを判断できるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

▣ アプリ開発2026-10-20
PHP の API が no-store を返し、Cloudflare は素通しでした。エッジの TTL だけを上書きした設計メモ
壁紙アプリの一覧 API が no-store を返していたため、Cloudflare の前に置いても毎回オリジンまで届いていました。端末側の挙動は変えずにエッジの TTL だけを上書きする Cache Rule、効いたかを確かめる検査スクリプト、古い応答を出さないための「アップロードとパージを一組にする」手順までを書き残します。
▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。
▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。