PHP временная страница: все способы реализации
Основные подходы к созданию временных страниц
Наиболее эффективное решение: простая проверка флага в PHP
Этот подход подходит для быстрого развертывания временной заглушки, когда сайт находится на стадии разработки или временно закрыт на обслуживание. Основная идея - использовать константу, файл или переменную окружения, которая включает или выключает режим временной страницы.
<?php
// index.php
$maintenanceFile = __DIR__ . '/.maintenance';
if (file_exists($maintenanceFile)) {
$remainingTime = file_get_contents($maintenanceFile); // время окончания, например '2025-12-31 23:59:59'
if (strtotime($remainingTime) > time()) {
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: 3600');
include 'maintenance.php';
exit;
}
}
// далее обычная логика приложения
?>Php временная страница (временная страница на php)
Пояснения:
- Создаётся файл
.maintenanceс датой окончания режима. Если файл существует и дата ещё не наступила - показывается заглушка. - Код возвращает HTTP-статус 503, что корректно для поисковых систем.
- Заголовок
Retry-Afterсообщает клиенту время ожидания.
Типичные ошибки и проблемы:
- Файл
.maintenanceзабывают удалить после окончания работ. - Некорректный формат даты - рекомендуется использовать ISO 8601 или timestamp.
- При использовании кеширования (например, Varnish) заголовки 503 могут игнорироваться.
Решение: автоматическое удаление файла по расписанию (Cron) или использование переменной окружения, управляемой через админку.
Как сделать временную страницу на основе IP-адреса?
Этот вариант позволяет показывать заглушку всем посетителям, кроме разработчиков с определённых IP.
<?php
$allowedIPs = ['192.168.1.1', '10.0.0.1'];
if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) {
header('HTTP/1.1 503 Service Unavailable');
include 'maintenance.php';
exit;
}
?>
Цели использования:
- Тестирование нового функционала в реальной среде без влияния на публичных пользователей.
- Применяется на стадии предрелиза (staging).
Проблема: динамические IP пользователей (например, мобильный интернет) делают этот метод ненадёжным. Решение - использовать VPN или базовую HTTP-аутентификацию.
Как сделать временную страницу с редиректом?
Перенаправление всех запросов на отдельный файл заглушки.
<?php
// .htaccess или nginx config не всегда доступны, тогда PHP-редирект:
header('Location: /maintenance.html');
exit;
?>
Цели:
- Быстрое переключение на статическую HTML-страницу без изменения серверных конфигов.
- Подходит для экстренных случаев, когда нужно закрыть сайт за секунду.
Ошибка: редирект будет бесконечным, если на maintenance.html тоже действует правило. Решение - исключить этот URL из проверки.
Как сделать временную страницу с таймером на PHP и JS?
Показывать обратный отсчёт до окончания технических работ.
<?php
$endTime = strtotime('2025-12-31 23:59:59');
$secondsLeft = $endTime - time();
?>
<!DOCTYPE html>
<html>
<body>
<h2>Сайт временно недоступен</h2>
<p id="timer"></p>
<script>
let seconds = <?= $secondsLeft ?>;
let timer = setInterval(() => {
let days = Math.floor(seconds / 86400);
let hours = Math.floor((seconds % 86400) / 3600);
let minutes = Math.floor((seconds % 3600) / 60);
let secs = seconds % 60;
document.getElementById('timer').innerText = `${days}д ${hours}ч ${minutes}м ${secs}с`;
seconds--;
if (seconds < 0) clearInterval(timer);
}, 1000);
</script>
</body>
</html>
Цели:
- Повышение информированности пользователей, снижение числа повторных запросов.
Проблема: если время окончания передано некорректно или часы сервера сбиты, таймер будет работать неправильно. Решение - синхронизировать время сервера через NTP.
Как сделать временную страницу через сессии?
Показывать заглушку только новым сессиям, а уже авторизованных администраторов пропускать.
<?php
session_start();
if (!isset($_SESSION['maintenance_skip'])) {
$_SESSION['maintenance_skip'] = ($_SERVER['REMOTE_ADDR'] === '192.168.1.1');
}
if ($_SESSION['maintenance_skip'] !== true) {
include 'maintenance.php';
exit;
}
?>
Цели:
- Возможность гибкого обхода заглушки для группы пользователей без изменения IP-белого списка.
Ошибка: если сессия не стартует (например, из-за настроек cookie), пользователь не увидит ничего. Нужно обеспечить корректную конфигурацию сессий.
Расширенные примеры и результаты
Пример 1. Временная страница с проверкой нескольких файлов-флагов
<?php
// Настройки
$flagsDir = __DIR__ . '/flags';
$activeFlag = $flagsDir . '/maintenance.active';
$scheduleFlag = $flagsDir . '/maintenance.schedule';
if (file_exists($activeFlag)) {
// Режим включён принудительно
$reason = 'Плановые технические работы';
$until = 'неизвестно';
// Читаем из файла дату, если есть
if (file_exists($scheduleFlag)) {
$until = file_get_contents($scheduleFlag);
}
renderMaintenance($reason, $until);
}
function renderMaintenance($reason, $until) {
header('HTTP/1.1 503 Service Unavailable');
header('Content-Type: text/html; charset=utf-8');
?>
<!DOCTYPE html>
<html>
<head><title>Временная страница</title></head>
<body>
<h2>Сайт на обслуживании</h2>
<p>Причина: <?= htmlspecialchars($reason) ?></p>
<p>Ориентировочное завершение: <?= htmlspecialchars($until) ?></p>
<!-- Можно добавить AJAX-опрос для автообновления -->
</body>
</html>
<?php
exit;
}
?>
Результат (вывод при наличии файла .maintenance.active): HTTP/1.1 503 Service Unavailable Страница с сообщением о технических работах и датой окончания.
Пример 2. Комбинированный подход: проверка IP и сессии с fallback
<?php
session_start();
$allowedIPFile = __DIR__ . '/allowed_ips.txt';
$allowedIPs = file_exists($allowedIPFile) ? file($allowedIPFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) : [];
$userIP = $_SERVER['REMOTE_ADDR'];
$isAllowed = in_array($userIP, $allowedIPs) || (isset($_SESSION['maintenance_bypass']) && $_SESSION['maintenance_bypass'] === true);
if (!$isAllowed) {
// Проверяем, есть ли глобальный флаг отключения
if (file_exists(__DIR__ . '/.maintenance')) {
header('HTTP/1.1 503 Service Unavailable');
readfile('maintenance.html');
exit;
}
}
// Продолжение нормальной работы
?>
Результат: Если IP в белом списке или сессия имеет bypass – сайт работает. Иначе – при наличии .maintenance показывается заглушка.
Пример 3. Временная страница с получением статуса из внешнего REST API (например, мониторинг)
<?php
// URL эндпоинта, возвращающего JSON: {"maintenance": true, "end_time": "2025-12-31T23:59:59Z"}
$apiUrl = 'https://api.example.com/maintenance-status';
$context = stream_context_create(['http' => ['timeout' => 2]]);
$response = @file_get_contents($apiUrl, false, $context);
if ($response !== false) {
$data = json_decode($response, true);
if (json_last_error() === JSON_ERROR_NONE && !empty($data['maintenance'])) {
header('HTTP/1.1 503 Service Unavailable');
$endTime = $data['end_time'] ?? 'неизвестно';
?>
<!DOCTYPE html>
<html>
<head><title>Обслуживание</title></head>
<body>
<h2>Ведутся технические работы</h2>
<p>Ожидаемое завершение: <?= htmlspecialchars($endTime) ?></p>
</body>
</html>
<?php
exit;
}
}
?>
Результат: Если API вернул maintenance=true – страница заглушки. Иначе – обычная работа. Полезно для распределённой системы, когда статус управляется централизованно.
Пример 4. Временная страница с ведением лога посетителей
<?php
// Логирование только когда включена временная страница
$logFile = __DIR__ . '/maintenance_access.log';
if (file_exists(__DIR__ . '/.maintenance')) {
$entry = date('Y-m-d H:i:s') . ' | ' . $_SERVER['REMOTE_ADDR'] . ' | ' . $_SERVER['REQUEST_URI'] . PHP_EOL;
file_put_contents($logFile, $entry, FILE_APPEND | LOCK_EX);
// Показываем заглушку
header('HTTP/1.1 503 Service Unavailable');
include 'maintenance.php';
exit;
}
?>
Результат: В файл maintenance_access.log записывается каждый запрос к временной странице. Полезно для анализа трафика во время работ.