戦え、エンジニア諸君!!
本番環境では、突発のリリース、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はご自身のものへ差し替えてご利用ください。
- 公式:CPI(KDDIウェブコミュニケーションズ)
CPIレンタルサーバー - 現場で効くサーバー運用の基礎:
[改訂3版]Zabbix統合監視実践入門 ──障害通知、傾向分析、可視化による省力運用 (Software Design plus) (PR)
📝 まとめ
- .htaccess が効かなくても慌てるな。共通ヘッダーで 503 を返すだけで“美しく止められる”。
- Retry-Afterでユーザーとクローラに誠実対応。
- IP 置換と周知フローをセットで運用に組み込め!
戦え、エンジニア諸君!!
サーバーの前に立ちはだかる壁を、自作の“盾(メンテ画面)”で受け止め、鋭く復帰せよッ!🔥