Cloudflareのみを利用して、メンテナンスページを作成してみます。
Cloudflareのプロプラン以上になります
Cloudflareの以下の機能を利用します
- Pages
 - Snippets
 
HTMLを作る
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>メンテナンス中</title>
  <style>
    body {
      margin: 0;
      padding: 0;
      background-color: #f7f7f7;
      font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
      display: flex;
      align-items: center;
      justify-content: center;
      height: 100vh;
      text-align: center;
      color: #333;
    }
    .container {
      max-width: 500px;
      padding: 20px;
    }
    h1 {
      font-size: 2.5em;
      margin-bottom: 0.5em;
    }
    p {
      font-size: 1.2em;
      margin-bottom: 1em;
    }
    .logo {
      max-width: 150px;
      margin-bottom: 1.5em;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>ただいまメンテナンス中です</h1>
    <p>ご迷惑をおかけして申し訳ございません。<br>現在、サイトのメンテナンスを行っております。</p>
    <p>しばらくしてから再度アクセスをお試しください。</p>
  </div>
</body>
</html>
CloudflareのPagesにHTMLファイルをアップロード
maintenance  
└── index.html
HTMLをアップロードする際はフォルダに入れる必要があります。
アップロード完了後はサイトをデプロイします。
Snippetsの作成
スクリプトの追加
// メンテナンスにしないIP
const allowedIPs = [
  "123.456.789.123"
];
export default {
  async fetch(request) {
    const clientIP = request.headers.get("cf-connecting-ip");
    console.log(clientIP)
    if (allowedIPs.includes(clientIP)) {
      // 管理者のIPなので通常処理へ
      return fetch(request);
    }
    // それ以外はメンテナンスページ(Cloudflare Pages)を503で返す
    const response = await fetch("https://xxx.pages.dev/"); // 作成したpagesのURL
    const html = await response.text();
    return new Response(html, {
      status: 503,
      headers: {
        "Content-Type": "text/html; charset=UTF-8",
        "Cache-Control": "no-store",
      },
    });
  },
};
作成したSnippetsを有効にすると、メンテナンスページになります。
ただ、Snippetsのスクリプトで定義したIPはメンテナンスにならず、通常のページへと遷移ができます。
メンテナンスのHTMLはSnippets内のスクリプトに記述しても良かったのですが、
ソースが長くなるので今回はPagesに配置しました。
Snippetsの詳細は以下の記事をご参考ください!


