◉ANTIGRAVITY LABEN
記事一覧/アプリ開発
▣ アプリ開発/2026-10-20中級

PHP の API が no-store を返し、Cloudflare は素通しでした。エッジの TTL だけを上書きした設計メモ

壁紙アプリの一覧 API が no-store を返していたため、Cloudflare の前に置いても毎回オリジンまで届いていました。端末側の挙動は変えずにエッジの TTL だけを上書きする Cache Rule、効いたかを確かめる検査スクリプト、古い応答を出さないための「アップロードとパージを一組にする」手順までを書き残します。

Cloudflare5Cache RulesPHPAPI設計キャッシュ3個人開発114Antigravity392

✦ プレミアム記事

壁紙アプリの一覧を返す API が、思ったより重いことには前から気づいておりました。カテゴリごとの一覧は件数が多く、アプリを開くたびに同じ内容を毎回オリジンの PHP が組み立てて返しています。

そこで、すでに画像の配信で使っている Cloudflare をこの API の前にも置いたはずでした。ところが応答ヘッダを見ると、cf-cache-status は HIT にならず、同じ一覧を続けて取っても毎回オリジンまで届いておりました。CDN を置いただけで、一度もキャッシュとして働いていなかったのです。

原因は単純で、PHP が返していた Cache-Control: no-store でした。個人開発の API ではよくある状態だと思いますので、直し方を「端末側は変えない」という条件つきで整理した記録を残します。

素通しだった理由は、二つ重なっていました

最初に確かめたのは、そもそもなぜ HIT にならないのかです。理由は二つありました。

一つめは、Cloudflare が標準でキャッシュの対象にするのは画像や CSS などの静的ファイルの拡張子で、.php が返す JSON は対象外だという点です。二つめは、オリジンの応答が no-store を宣言していた点です。PHP はセッションを開始すると、Cache-Control: no-store, no-cache, must-revalidate を既定で付けます。セッションを使うつもりのない API でも、共通の読み込み処理の中で session_start() が呼ばれていると、同じ応答になります。

つまり、拡張子の面でもヘッダの面でも、エッジが持たない側に倒れていました。どちらか片方だけ直しても足りません。

直し方は三通りあり、「端末側に効くか」で選びました

手段は三つ考えました。

手段エッジ端末側(アプリ)私の判断
オリジンの Cache-Control を public, max-age=… に変える効く効く(端末にも古い応答が残る)見送り
Cache Rule で Edge TTL だけを上書きする効く変わらない採用
Worker で応答を組み替える効く組み替え次第過剰なので見送り

決め手は、端末側に効くかどうかでした。出荷済みのアプリは、更新を入れていない利用者の手元で動き続けます。オリジンの Cache-Control を変えると、その旧版の端末にも「しばらく取り直さない」という指示が届いてしまい、後から中身を直しても端末に残った応答は私の側から消せません。エッジの TTL だけを上書きすれば、端末には従来どおりの指示が届き、エッジで受け止める分だけを増やせます。

なお、応答の項目を位置で読む API は、項目を末尾にしか足せません。その制約を守る運用は 別の記事 に書きました。キャッシュを足す前に、その約束が崩れていないことも確かめておくと安心です。

✦

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

この記事の続きを読む

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

この記事で得られること
✦自分の API が CDN を素通ししていないかを、cf-cache-status と age を並べるだけの小さなスクリプトで数分のうちに判定できるようになります
✦オリジンの Cache-Control を書き換えず、エッジの TTL だけを上書きする設計を選べるようになり、出荷済みアプリの端末側キャッシュまで巻き込む事故を、設定を入れる前に避けられるようになります
✦キャッシュを効かせた代わりに生まれる「古い応答」の窓を、アップロードとパージを一つの手順に束ねて塞げるようになり、更新したのに画面が変わらない問い合わせ対応の時間を省けるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

▣ アプリ開発2026-10-15
immutable を付けた資産を同じ URL で差し替えたら、利用者のブラウザだけが古いままでした
長期キャッシュを付けた JS を同じ URL で差し替えても、CDN をパージしてもブラウザは取り直しません。同じ URL・no-cache・クエリ付き・内容ハッシュ名の 4 方式を Chromium で並べて比べ、ビルドの最後にハッシュを付ける完全なスクリプトまでをまとめました。
▣ アプリ開発2026-09-29
Cloudflare をパージしても古い壁紙が届き続けた原因は、オリジン側で JPEG を握っていた XPageSpeed
同じ URL に上書きした壁紙画像が、Cloudflare をパージしても古いまま届き続けた運用の記録です。ローカル・オリジン・エッジの三者を突き合わせて層を名指しする検査、プレフィックスパージの使いどころ、Xserver の XPageSpeed を .htaccess で安全に切る書き方まで扱います。
▣ アプリ開発2026-10-20
文言を直したら、新しく足した字だけが豆腐になりました。日本語 Web フォントのサブセットに欠け字チェックを足す手順
日本語の文言を一行直しただけで、新しく加えた字だけが豆腐(□)になることがあります。サブセット化したフォントに無い文字をファイルと行番号つきで洗い出し、1 文字でも欠けたら止める小さなスクリプトを、実際に動かした出力つきで書き残します。