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 записывается каждый запрос к временной странице. Полезно для анализа трафика во время работ.

Временная страница на PHP - comments

En
Php временная страница (php)