フォロー

🛡️ CPIサーバーで戦う!団長流メンテナンス画面の出し方ッ

戦え、エンジニア諸君!!
本番環境では、突発のリリース、DBメンテ、セキュリティ修正―― ユーザーに 500/404 を見せず、誠実なメンテナンス画面で受け止めるのが信用の第一歩だ。
ただし CPI サーバーは .htaccess の 301/302 リダイレクトが制限される構成がある。そこで団長は、 .htaccess を使わず “共通ヘッダーの PHP だけ”で確実に止める方法を授ける!


1. シンプル実装(共通ヘッダーに追加するだけ)

以下を 共通ヘッダー(一番最初に読み込まれる PHP)へ追記せよ。
許可したい IP 以外は HTTP 503 + Retry-After を返し、maintenance.html を表示する。

<?php
/**
 * CPI向けメンテナンス・ゲート(.htaccess不要)
 * - 許可IP以外は503 + maintenance.htmlを返す
 * - 先頭に置く(何も出力される前に header() を送る)
 */

// 許可IP(例示用の文書用アドレス。実運用では自分の固定IPへ置換)
$allowed_ips = [
  '203.0.113.42',   // IPv4(TEST-NET-3:文書用)
  '2001:db8::1234', // IPv6(文書用)
];

// メンテナンスON/OFF(必要に応じてコメントアウトで停止)
if (!in_array($_SERVER['REMOTE_ADDR'] ?? '', $allowed_ips, true)) {
    header('HTTP/1.1 503 Service Temporarily Unavailable');
    header('Retry-After: 3600'); // 1時間後の再訪を推奨(必要に応じて変更)
    header('Content-Type: text/html; charset=UTF-8');

    // ルート1階層上に置いた maintenance.html を返す例(パスは環境に合わせて)
    readfile(__DIR__ . '/../maintenance.html');
    exit;
}
?>
  • 設置場所:すべてのページよりも先に実行される「共通ヘッダー」や「フロントコントローラ(index.php)」。
  • ON/OFF:運用中はこのブロックをコメントアウト/復活するだけで切替可。
  • SEO/クローラ配慮:503 + Retry-After を返すため“メンテ中”として認識されやすい。

2. メンテナンスページの最小テンプレ

maintenance.html はシンプルで構わない。ブランドカラーだけ整えておけば十分だ。

<!doctype html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>メンテナンス中</title>
  <style>
    :root{ --bg:#0d1117; --fg:#fff; --muted:#9aa4af; }
    body{ margin:0; min-height:100svh; display:grid; place-items:center;
          background:var(--bg); color:var(--fg); font:16px/1.6 system-ui, -apple-system, Segoe UI, sans-serif; }
    .wrap{ text-align:center; padding:8vh 6vw; max-width:720px; }
    h1{ font-size:1.8rem; margin:0 0 .6rem; }
    p{ margin:.25rem 0; }
    small{ color:var(--muted); }
  </style>
</head>
<body>
  <div class="wrap">
    <h1>只今メンテナンス中です</h1>
    <p>ご不便をおかけしますが、復旧までしばらくお待ちください。</p>
    <p><small>※しばらく経っても表示が変わらない場合は、ブラウザの再読み込みをお試しください。</small></p>
  </div>
</body>
</html>

3. 注意点(実運用で噛みがちな罠)

  • IP は必ず自分の固定IPへ置換(上記の 203.0.113.42 / 2001:db8::1234 は文書用の例示アドレス)。
  • CDN/プロキシ越しでは REMOTE_ADDR がプロキシIPになることがある。必要なら HTTP_X_FORWARDED_FOR を採用するロジックに拡張。
  • API/決済通知/監視の送信元IP は別途許可リストへ追加。
  • 長引くメンテでは Retry-After を秒ではなく日時(例:Fri, 12 Jul 2025 12:00:00 GMT)で返すのもアリ。

補足: 203.0.113.0/24(TEST-NET-3)と 2001:db8::/32文書用に予約されたアドレス範囲であり、解説用サンプルとしてブログに掲載して問題ない。


4. 団長の心得ッ!

  • “先頭で判定”して “何も出力する前に header()” を送る――これが鉄則。
  • デザインは誠実・簡潔に。派手さよりも安心感を。
  • 事前周知(X/告知ページ)と、復旧時のアナウンスまでを“運用の一連の作法”として用意しておけ。

📦 団長の装備(PR)

※以下リンクにはアフィリエイト(PR)が含まれます。IDはご自身のものへ差し替えてご利用ください。


📝 まとめ

  • .htaccess が効かなくても慌てるな。共通ヘッダーで 503 を返すだけで“美しく止められる”。
  • Retry-Afterでユーザーとクローラに誠実対応。
  • IP 置換と周知フローをセットで運用に組み込め!

戦え、エンジニア諸君!!
サーバーの前に立ちはだかる壁を、自作の“盾(メンテ画面)”で受け止め、鋭く復帰せよッ!🔥

コメントする