+ 作るログイン
図を読み込んでいます…
1 / 13
Cloudflare のすべて ― 1機能ずつ、仕組みと存在理由から / 全35本

Cloudflare 19:Pages ― push したら公開される静的サイト置き場

発行
アニメモ公式
版
第1版
改訂
コマ
全13

git リポジトリをつなぐだけで、ビルドと世界中への配信を Cloudflare がやってくれる Pages を説明します。ブランチごとのプレビュー、Pages Functions、_redirects と _headers、料金と制限、そして新しく作るなら Workers の静的アセットがすすめられている今の関係まで。

静的サイトを公開したいだけなのに、やることが多い

自己紹介のページ、イベントの告知サイト、React で作った小さなアプリ。作ったのは HTML・CSS・JavaScript と画像だけです。これを世界に公開するには、何が要るでしょうか。

昔ながらのやり方だと、まずサーバーを借り、Web サーバーのソフトを入れ、ファイルをアップロードします。HTTPS にするには証明書を取り、期限が切れる前に更新します。海外の人にも速く見せたいなら CDN も設定します。そして、ファイルを直すたびに、また手でアップロードし直します。

チームで作っていると、もう1つ困ることがあります。「この変更、本番に出す前にみんなに見てもらいたい」ときに、確認用の場所が無いのです。自分のパソコンで動かして画面を共有するか、本番に出してから直すか、になりがちです。

作ったのは静的なファイルだけなのに、公開のための作業のほうが多くなってしまいます。欲しいのは、「git に push したら、勝手にビルドされて、世界中に公開されて、確認用の URL も付く」ことのはずです。

この号で扱う Cloudflare Pages は、まさにそれをするための機能です。あわせて、最近の Cloudflare が「新しく作るなら Workers(18号)で」とすすめている事情も見ていきます。

※この号の内容は 2026年9月時点の情報をもとにしています。料金や上限、すすめられている方法は変わることがあるので、使うときは必ず公式のドキュメントで確かめてください。

  • Cloudflare のすべて 19 ― Pages
  • 1 / 13
  • 静的サイトを公開したいだけなのに、やることが多い
  • サーバーを用意する
  • 作ったもの
  • HTML・CSS・JS・画像
  • ファイルをアップロード
  • 毎回、手で?
  • HTTPS の証明書
  • push したら勝手に公開されてほしい
  • 世界中で速く見せる
  • 変更前に確認する場
  • 作ったのは HTML と CSS だけ。なのに置き場・HTTPS・確認の場が要る。

一言でいうと:git に push すると公開される置き場

Pages を一言でいうと、「git のリポジトリにつないでおくと、push するたびにビルドして、世界中の拠点に配ってくれる静的サイトの置き場」です。

図の流れを左から見てください。

段何が起きるか
リポジトリGitHub や GitLab に、あなたのコードがある
ビルドpush を合図に、Cloudflare がビルドのコマンドを実行する
出力ビルドでできたファイル(dist/ など)を集める
世界中の拠点そのファイルを Cloudflare の拠点に配る。*.pages.dev の住所ですぐ見られる

あなたがやるのは、最初に一度リポジトリをつなぐことと、あとは普段どおり push することだけです。サーバーも、証明書の更新も、CDN の設定もいりません。ファイルは00号で見た世界中の拠点から配られるので、どの国の利用者にも近くから届きます。

しかも、静的ファイルの配信は、リクエストの回数に制限なく無料です。アクセスが急に増えても、料金を心配する必要がありません。この点が、個人やスタートアップに Pages が広く使われてきた大きな理由です。

  • Cloudflare のすべて 19 ― Pages
  • 2 / 13
  • 一言でいうと:git に push すると公開される置き場
  • GitHub・GitLab
  • ビルド
  • 出力(dist/)
  • 世界中の拠点
  • *.pages.dev
  • あなたのコード
  • npm run build
  • HTML・CSS・JS
  • 近くの拠点から返す
  • リポジトリをつなぐ → push → Cloudflare がビルド → 世界中の拠点に配る
  • サーバーも証明書も要らない。静的ファイルの配信は回数の制限なく無料
  • つないだリポジトリに push するたび、ビルドして世界中へ配る。

ビルドは Cloudflare の中で走る

最近の Web サイトは、書いたファイルをそのまま置くのではなく、ビルドしてから公開するのが普通です。React や Vue のコードをまとめて小さくしたり、Markdown から HTML を作ったりする段階です。

Pages では、このビルドを Cloudflare の中で実行します。あなたが教えるのは2つだけです。

設定例意味
ビルドコマンドnpm run buildビルドのために実行するコマンド
出力ディレクトリdistビルドでできたファイルが置かれる場所

push が届くと、Cloudflare はリポジトリを取ってきて、依存関係を入れ(npm ci など)、ビルドコマンドを実行し、出力ディレクトリの中身を世界中に配ります。ビルドの記録(ログ)は管理画面で見られるので、失敗したときも原因を追えます。

よく使われるフレームワーク(React・Vue・Svelte・Astro など)には雛形の設定が用意されていて、選ぶだけでビルドコマンドと出力ディレクトリが入ります。

手元のパソコンでビルドする必要がないので、「自分のパソコンでは動くのに」という問題も減ります。誰が push しても、同じ手順でビルドされるからです。

  • Cloudflare のすべて 19 ― Pages
  • 3 / 13
  • ビルドは Cloudflare の中で走る
  • GitHub・GitLab
  • ビルド
  • 出力(dist/)
  • 世界中の拠点
  • *.pages.dev
  • $ npm ci
  • $ npm run build # 例:vite build / astro build
  • → dist/ にできたファイルを、世界中の拠点へ配る
  • React・Vue・Astro・Next.js(静的書き出し)などの設定は、雛形から選べる
  • ビルドのコマンドと出力の場所を教えるだけ。手元でビルドしなくてよい。

ブランチごとに、別の URL で確かめられる

Pages のいちばん便利な機能が、プレビューです。

git では、新しい機能を作るとき、main(本番)とは別のブランチで作業するのが普通です。Pages は、本番のブランチ(ふつうは main)に push されたときは本番のサイトを更新し、それ以外のブランチに push されたときは、別の URL にプレビューを作ります。

push したブランチ公開される先
mainmy-site.pages.dev(本番)
feature-xfeature-x.my-site.pages.dev(そのブランチの最新)
どのコミットでも<コミットごとの文字列>.my-site.pages.dev(その時点の版)

GitHub でプルリクエストを作ると、Cloudflare がプレビューの URL をコメントで書き込んでくれます。レビューする人は、そのリンクを開くだけで、本番とまったく同じ環境で変更後のサイトを確かめられます。デザイナーや企画の人など、コードを読まない人にも見てもらえるのが大きな利点です。

本番は、main にマージするまで一切変わりません。プレビューで問題が見つかっても、本番の利用者には影響がないのです。

もし本番で問題が起きたら、管理画面から過去の公開(デプロイ)を選んで、すぐに戻すこともできます。

  • Cloudflare のすべて 19 ― Pages
  • 4 / 13
  • ブランチごとに、別の URL で確かめられる
  • GitHub・GitLab
  • ビルド
  • 出力(dist/)
  • 世界中の拠点
  • *.pages.dev
  • main
  • my-site.pages.dev(本番)
  • feature-x
  • feature-x.my-site.pages.dev(プレビュー)
  • コミットごとにも固有の URL が付く。PR にリンクが書き込まれる
  • main は本番、それ以外のブランチはプレビュー。本番を壊さずに見せられる。

Pages Functions:functions/ に置けば API になる

静的なサイトでも、少しだけサーバー側の処理が欲しくなることがあります。問い合わせフォームの受け取り、ログインの確認、外部 API の呼び出し(キーを隠したい)などです。

Pages では、リポジトリに functions/ というフォルダを作り、そこに JavaScript や TypeScript のファイルを置くと、それがサーバー側のコードとして動きます。これが Pages Functions です。

特徴は、ファイルの場所がそのまま URL の道になることです。

ファイル応える URL
functions/api/hello.ts/api/hello
functions/api/users/[id].ts/api/users/123 など([id] の部分が変わってよい)
functions/_middleware.tsすべてのリクエストの前に動く

functions/ の道に当たらないリクエストには、今までどおり静的ファイルが返ります。

Pages Functions の中身は、Workers そのものです(18号)。同じ実行環境で動き、同じようにバインディングで KV(20号)・R2(22号)・D1(23号)などにつなげます。料金も、Workers のリクエストとして数えられます。つまり Pages は、「静的ファイルの配信」と「Workers」を、git 連携とファイル名の決まりで使いやすくまとめたもの、と考えられます。

  • Cloudflare のすべて 19 ― Pages
  • 5 / 13
  • Pages Functions:functions/ に置けば API になる
  • GitHub・GitLab
  • ビルド
  • 出力(dist/)
  • 世界中の拠点
  • *.pages.dev
  • functions/
  • 静的ファイルは そのまま返す
  • api/
  • functions/ の道だけ コードが動く
  • hello.ts → /api/hello
  • users/[id].ts → /api/users/123
  • 実行は Workers と同じ仕組み(18号)
  • ファイルの場所がそのまま URL の道になる。中身は Workers。

導入:リポジトリをつなぎ、3つの値を入れる

Pages を始める手順です。Cloudflare のアカウントと、GitHub か GitLab のリポジトリがあれば始められます。ドメインは要りません。

順番やること
1管理画面の「Workers & Pages」から、Pages のプロジェクトを作る
2GitHub(または GitLab)のアカウントをつなぎ、リポジトリを選ぶ
3本番のブランチ、フレームワーク、ビルドコマンド、出力ディレクトリを入れる
4保存すると最初のビルドが走り、<プロジェクト名>.pages.dev で公開される

3で入れる値は、図の表のとおりです。フレームワークを選ぶと、ビルドコマンドと出力ディレクトリは自動で入るので、多くの場合は確かめるだけで済みます。

環境変数は、本番とプレビューで別の値を入れられます。たとえば、プレビューではテスト用の API につなぐ、といった使い分けができます。

自分のドメインで公開したいときは、プロジェクトの「カスタムドメイン」で www.example.com などを追加します。ドメインが Cloudflare の DNS(01号)で管理されていれば、DNS の行も証明書(03号)も自動で用意されます。

git を使わずに、手元でビルドしたファイルを直接上げる方法(Direct Upload)もあります。

$ npx wrangler pages deploy dist --project-name my-site

ただし、あとから git 連携に切り替えることはできないので、どちらで運用するかは最初に決めておきましょう。

  • Cloudflare のすべて 19 ― Pages
  • 6 / 13
  • 導入:リポジトリをつなぎ、3つの値を入れる
  • Workers & Pages
  • リポジトリを選ぶ
  • ビルド設定
  • 保存して公開
  • フレームワーク
  • 雛形を選ぶと、下の2つが自動で入る
  • ビルドコマンド
  • npm run build
  • 出力ディレクトリ
  • dist(Vite)・out・build など
  • 環境変数
  • 本番とプレビューで別の値を持てる
  • フレームワーク・ビルドコマンド・出力ディレクトリ。これで最初の公開まで進む。

_redirects と _headers で、配り方を決める

普通の Web サーバーなら、リダイレクトやヘッダーは、サーバーの設定ファイルに書きます。Pages にはサーバーの設定ファイルがありません。代わりに、出力ディレクトリの一番上に、決まった名前のテキストファイルを置きます。

_redirects は、リダイレクトの規則です。1行に「元の道・行き先・状態コード」を書きます。

/old-page    /new-page      301
/blog/*      /news/:splat   301

2行目の * と :splat は、「/blog/ 以下の残りの部分をそのまま引き継ぐ」という意味です。サイトの構成を変えたとき、古いリンクを壊さずに済みます。

_headers は、応答に付けるヘッダーの規則です。道の行の下に、字下げしてヘッダーを書きます。

/assets/*
  Cache-Control: public, max-age=31536000, immutable
/*
  X-Frame-Options: DENY

1つ目は「ファイル名に版が入っている画像や JS は、ブラウザに長く覚えさせる」、2つ目は「他のサイトの枠(iframe)の中に表示させない」という設定です。

どちらも、public/ のように「ビルドのときそのまま出力にコピーされるフォルダ」に置いておけば、ビルドのたびに出力ディレクトリの一番上に入ります。もっと複雑な判断が要るときは、Functions(前のページ)や、ドメイン全体のルール(09号)を使います。

  • Cloudflare のすべて 19 ― Pages
  • 7 / 13
  • _redirects と _headers で、配り方を決める
  • _redirects
  • _headers
  • /old-page /new-page 301
  • /assets/*
  • /blog/* /news/:splat 301
  • Cache-Control: max-age=31536000
  • /*
  • X-Frame-Options: DENY
  • どちらも出力ディレクトリ(dist/ など)の一番上に置く
  • 手でファイルを上げたいときは wrangler pages deploy dist(Direct Upload)
  • サーバーの設定ファイルの代わりに、出力に2つのテキストを置く。

Functions の書き方:onRequest を export する

Pages Functions のファイルでは、onRequest という名前の関数を export します。GET だけに応えたいときは onRequestGet、POST なら onRequestPost のように、メソッドの名前を付けます。

ts
// functions/api/users/[id].ts
interface Env {
  KV: KVNamespace;
}

export const onRequestGet: PagesFunction<Env> = async (context) => {
  const id = context.params.id;                  // URL の [id] の部分
  const user = await context.env.KV.get(`user:${id}`);
  if (!user) {
    return new Response("not found", { status: 404 });
  }
  return new Response(user, {
    headers: { "content-type": "application/json" },
  });
};

引数の context には、次のものが入っています。

名前中身
context.request届いたリクエスト
context.envバインディング(KV・R2・D1 など)と環境変数
context.paramsURL の [id] のような変わる部分
context.next()次の処理(静的ファイルなど)に渡す

Workers の fetch(request, env, ctx) と比べると、入っているものはほぼ同じです。書き方が少し違うだけで、中で動いているのは Workers です。

バインディングは、管理画面のプロジェクトの設定か、wrangler.toml(または wrangler.jsonc)に書きます。手元で試すときは npx wrangler pages dev dist を使います。

  • Cloudflare のすべて 19 ― Pages
  • 8 / 13
  • Functions の書き方:onRequest を export する
  • functions/api/users/[id].ts
  • export const onRequestGet: PagesFunction<Env> = async (context) => {
  • const id = context.params.id; // URL の [id] の部分
  • const user = await context.env.KV.get(`user:${id}`);
  • if (!user) return new Response("not found", { status: 404 });
  • return new Response(user, { headers: { "content-type": "application/json" } });
  • };
  • 引数の context に request・env・params が入っている。

Pages と Workers、いまはどちらを選ぶか

ここまで読んで、「Workers(18号)と何が違うの?」と思った人もいるでしょう。実は、その疑問はもっともで、Cloudflare 自身が、この2つを1つにまとめる方向に進んでいます。

以前は、「静的ファイルは Pages、コードは Workers」と役割が分かれていました。ところが、Workers に静的アセット(18号)が加わり、Workers だけで静的ファイルを無料で配れるようになりました。さらに、Workers にも git 連携(Workers Builds)と、ブランチごとのプレビュー URL が入りました。Pages にしかなかった便利さが、Workers でもほぼ手に入るようになったのです。

そのうえで、2026年9月時点の Cloudflare の公式のすすめは、次のとおりです。

場面すすめ
これから新しく作るWorkers と静的アセットで始める
いま Pages で動いているそのまま使ってよい。急いで移す必要はない
Pages で困りごとが出たWorkers への移行を考える。移行の手引きが公式にある

Workers を選ぶ理由は、Durable Objects(21号)、Cron Triggers(25号)、Queues の受け取り(24号)など、Pages Functions では使えない、または使いにくい機能を、1つのプロジェクトの中で自由に組み合わせられることです。新しい機能も Workers 側に先に入っています。

移行は、多くの場合「作り直し」ではなく「設定の書き換え」で済みます。wrangler の設定に assets を書き、バインディングと環境変数を移し、カスタムドメインを付け替える、という作業です。

  • Cloudflare のすべて 19 ― Pages
  • 9 / 13
  • Pages と Workers、いまはどちらを選ぶか
  • Pages
  • Workers + 静的アセット
  • 静的サイトと Functions
  • 画面も API も1つで
  • 今ある Pages はそのまま動く
  • Durable Objects・Cron など全部
  • git 連携とプレビューが簡単
  • git 連携もプレビュー URL もある
  • 新機能は Workers 側に入る
  • 移行は主に設定の書き換え
  • 新しく作るなら Workers と静的アセット。Pages も引き続き使える。

料金と制限:配信は無料、数えるのはビルドと Functions

Pages の料金の考え方は単純です。静的ファイルの配信は無料で、数えるのは「ビルド」と「Functions」です。2026年9月時点の主な数字は次のとおりです。料金・上限は変わるので、必ず公式の Pricing と Limits のページで確かめてください。

項目Free の目安
静的ファイルの配信無料・回数の制限なし
ビルドの回数月500回まで(有料プランで増える)
同時に走るビルド1つ
1回の公開に含められるファイル数2万ファイルまで
FunctionsWorkers の料金と無料枠で数える(18号)

ビルドの回数は、本番とプレビューを合わせて数えます。小さなコミットを何度も push するチームや、いくつものブランチを同時に動かすチームでは、月500回に意外と早く届くことがあります。プレビューを作るブランチを絞る設定もあります。

Functions は Workers と同じ扱いなので、Free なら1日10万回、1回あたりの CPU 時間は短く、という Workers の制限(18号)がそのまま当てはまります。静的なページだけのサイトなら、Functions は1回も動かないので、この制限は関係ありません。

ファイル1つの大きさにも上限があります。大きな動画や、大量の画像を配りたいときは、R2(22号)に置いて配るほうが向いています。

  • Cloudflare のすべて 19 ― Pages
  • 10 / 13
  • 料金と制限:配信は無料、数えるのはビルドと Functions
  • 静的ファイルの配信
  • 無料・回数の制限なし
  • ビルドの回数
  • Free は月500回(有料プランで増える)
  • 同時ビルド
  • Free は1つずつ
  • 1回の公開のファイル数
  • Free は2万ファイルまで
  • Functions
  • Workers の料金と無料枠で数える(18号)
  • 2026年9月時点。上限・料金は変わるので、公式の Pricing と Limits のページで確かめること
  • 静的なページだけなら、アクセスがどれだけ増えても無料で配れる。

よくある落とし穴

Pages でよくつまずく点をまとめます。

落とし穴何が起きるかどうするか
プレビューは既定で公開URL を知っていれば誰でも見られる。未発表の内容が漏れるAccess(16号)でプレビューだけ守る設定がある
出力ディレクトリの指定違い空のサイトになる、または 404 だらけになる手元のビルドで、ファイルがどこにできるか確かめる
環境変数を本番だけに入れるプレビューのビルドだけ失敗する本番とプレビューの両方に入れる
404.html の有無404.html が無いと SPA とみなされ、無い道にも index.html が返る。置くと 404.html が返る無い道を開いて、意図どおりか確かめる
秘密の値をビルドに埋め込むフロントのコードに入った値は、誰でも読める秘密は Functions の中でだけ使う

いちばん多い事故は、1つ目と5つ目です。「プレビューだから」「ビルドの中だから」と油断すると、見せてはいけないものが公開されてしまいます。

特に5つ目は勘違いしやすい点です。Vite の VITE_ で始まる環境変数のように、ビルドのときにフロントのコードへ埋め込まれる値は、完成したファイルに文字として残ります。API キーのような秘密は、Functions(サーバー側)の環境変数にだけ入れ、ブラウザには渡さないようにしましょう。

  • Cloudflare のすべて 19 ― Pages
  • 11 / 13
  • よくある落とし穴
  • プレビュー URL は既定で公開:見られて困るなら Access で守る(16号)
  • 出力ディレクトリの指定違い:空のサイトや 404 になる
  • 環境変数を本番だけに入れる:プレビューのビルドが失敗する
  • 404.html の有無で、無い道への返事が変わる(SPA 扱い)
  • API を足すなら Functions、大きくなったら Workers へ
  • プレビューは誰でも見られる。秘密の値とアクセス制限に気をつける。

他の号とのつながり

Pages は、いくつもの号とつながっています。

号機能Pages との関係
18WorkersPages Functions の中身。新しく作るなら Workers と静的アセットも候補
20KVFunctions から設定やセッションを読む
22R2大きなファイルや、利用者が上げた画像を置く
23D1Functions から SQL のデータベースを使う
01DNS自分のドメインで公開するときの入り口
02CDN とキャッシュ静的ファイルが近くの拠点から返る仕組み
16Accessプレビューや社内向けのサイトを、決めた人だけに見せる
34Wrangler と Terraformwrangler pages deploy や設定の管理

上の段(18・20・22・23)は、Pages Functions からバインディングでつなぐものです。下の段は、Pages を公開し、守り、管理するためのものです。

とくに 16号の Access との組み合わせは覚えておくと便利です。社内向けのドキュメントサイトを Pages で作り、Access で「会社のメールアドレスでログインした人だけ」に見せる、という使い方がよくあります。

  • Cloudflare のすべて 19 ― Pages
  • 12 / 13
  • 他の号とのつながり
  • 18 Workers
  • 20 KV
  • 22 R2
  • 23 D1
  • Pages(19)
  • 01 DNS
  • 02 キャッシュ
  • 16 Access
  • 34 Wrangler
  • Functions からは KV・R2・D1 がつながる。独自ドメインは DNS の号で。

まとめ:Pages は「push したら公開」の静的サイト置き場

この号で見たことをまとめます。

項目内容
なぜあるか静的サイトの公開から、サーバーと手作業を消すため
仕組みリポジトリをつなぐ → push → Cloudflare がビルド → 世界中の拠点へ
プレビューブランチ・コミットごとに URL が付く。本番は main だけ
動的な部分functions/ に置くとサーバー側のコード(中身は Workers)
配り方の設定_redirects と _headers を出力に置く
料金静的配信は無料・回数無制限。ビルド回数と Functions を数える
注意プレビューは公開、秘密をビルドに埋め込まない
いまの選び方新しく作るなら Workers と静的アセット。既存の Pages はそのままでよい

Pages は、「静的なサイトを、git の流れのまま公開する」ためのいちばん手軽な道具です。一方で、Cloudflare の開発者向け機能の中心は Workers に移りつつあります。これから作るものは、18号の Workers の静的アセットと見比べてから選びましょう。次の20号では、Workers から使うデータの置き場の1つ目、KV を見ていきます。

  • Cloudflare のすべて 19 ― Pages
  • 13 / 13
  • まとめ:Pages は「push したら公開」の静的サイト置き場
  • GitHub・GitLab
  • ビルド
  • 出力(dist/)
  • 世界中の拠点
  • *.pages.dev
  • なぜあるか
  • 静的サイトの公開から、サーバーと手作業を消すため
  • 仕組み
  • push → ビルド → 世界中の拠点へ
  • プレビュー
  • ブランチ・コミットごとに URL が付く
  • 動的な部分
  • functions/ に置くと API(Workers と同じ)
  • git 連携・プレビュー・無料配信。新規なら Workers の静的アセットも検討する。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]