Заглушка для Сайта на Время Обслуживания с помощью Apache и HTAccess

В данной статье Вы найдете информацию о том, как перенаправить весь трафик и всех посетителей сайта на страницу с информацией о техническом обслуживании на время обновления сайта.

Я покажу как создать страницу-заглушку с информацией о проводимых работах, как перевести сайт в режим обслуживания и как вернуть его online без перезапуска Apache.

Вы узнаете как перенаправить трафик виртуального хоста Apache на страницу-заглушку используя как конфиг VirtualHost, так и .HTAccess файл.

Создание Страницы-Заглушки

Первый делом, необходимо создать 2 файла в корне сайта (document root):

Файл Назначение
maintenance.html Файл, содержащий HTML код страницы-заглушки
maintenance.enable Пустой файл, который будет активировать режим технического обслуживания

[maintenance.html]

Создайте страницу maintenance.html, на которую будут перенаправляться посетители и которая будет информировать их о том, что сайт находится на техническом обслуживании.

В качестве примера можете использовать следующий HTML код страницы-заглушки (демо):

<!DOCTYPE html>
<html>
    <head>
        <title>Сайт Закрыт на Техническое Обслуживание</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <style>
        h1 { font-size: 50px; }
        body { text-align:center; font: 20px Helvetica, sans-serif; color: #333; }
        </style>
    </head>
    <body>
        <h1>Сайт Закрыт на Техническое Обслуживание</h1>
	<p>Приносим извинения за неудобство, но в данный момент сайт находится на техническом обслуживание.</p>
	<p>Скоро мы вернемся online!</p>
    </body>
</html>

[maintenance.enable]

В корне сайта (document root) создайте пустой файл с именем maintenance.enable.

Мы будем использовать его для ВКЛЮЧЕНИЯ и ВЫКЛЮЧЕНИЯ заглушки без перезапуска Apache.

Мы настроим Apache таким образом, что при нахождении файла maintenance.enable в корне сайта, будет включаться режим технического обслуживания и все посетители сайта будут перенаправляться на страницу-заглушку. В обратном случае (файл maintenance.enable отсутствует) сайт будет работать в штатном режиме.

Таким образом, если нам необходимо включить редирект сайта на время обслуживания, мы создаем пустой файл maintenance.enable.

А когда нам будет необходимо вернуть сайт online после обслуживания, мы попросту удалим файл maintenance.enable.

Редирект Apache Vhost-а на Страницу-Заглушку

Добавьте следующие правила в конфиг Вашего Vhost-а (Apache VirtualHost) для редиректа всех посетителей сайта на страницу-заглушку:

Этот кусок должен быть вставлен перед всеми другими редиректами и состояниями.

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{DOCUMENT_ROOT}/maintenance.enable -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /maintenance.html [R=503,L]
ErrorDocument 503 /maintenance.html
Header Set Cache-Control "max-age=0, no-store"

Перезапустите Apache, чтобы изменения вступили в силу:

# apachectl graceful

Теперь Вы можете ВКЛЮЧАТЬ и ВЫКЛЮЧАТЬ режим технического обслуживания сайта с помощью файла maintenance.enable не перезапуская Apache каждый раз.

Редирект на Страницу-Заглушку с помощью HTAccess

Для редиректа всех посетителей на страницу-заглушку, разместите следующий код в .htaccess файле, находящимся в корне сайта :

Этот кусок должен быть вставлен перед всеми другими редиректами и состояниями.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000
RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{DOCUMENT_ROOT}/maintenance.enable -f
RewriteCond %{SCRIPT_FILENAME} !maintenance.html
RewriteRule ^.*$ /maintenance.html [R=503,L]
ErrorDocument 503 /maintenance.html
Header Set Cache-Control "max-age=0, no-store"
</IfModule>

Разъяснение

1. Включаем Rewrite Engine.

RewriteEngine On

2. (опционально) Исключаем Ваш IP адрес. Используйте эту директиву, чтобы не перенаправлять трафик с указанного IP адреса на maintenance.html.

RewriteCond %{REMOTE_ADDR} !^123\.456\.789\.000

Вы можете указать несколько IP адресов:

RewriteCond %{REMOTE_ADDR} !^192\.168\.0\.1
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.100
RewriteCond %{REMOTE_ADDR} !^172\.16\.10\.15

3. Убеждаемся что maintenance.html существует.

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f

4. Проверяем существование файла maintenance.enable (этой проверкой мы включаем и выключаем режим обслуживания).

RewriteCond %{DOCUMENT_ROOT}/maintenance.enable -f

5. Это правило нам необходимо для предотвращения зацикливания.

RewriteCond %{SCRIPT_FILENAME} !maintenance.html

6. Собственно сам 503-ий редирект на страницу-заглушку.

RewriteRule ^.*$ /maintenance.html [R=503,L]
ErrorDocument 503 /maintenance.html

503 Service Unavailable — код состояния HTTP, означающий что сервер временно не имеет возможности обрабатывать запросы по техническим причинам (обслуживание, перегрузка и прочее).

7. Выключаем кэширование.

Header Set Cache-Control "max-age=0, no-store"

10 Replies to “Заглушка для Сайта на Время Обслуживания с помощью Apache и HTAccess”

  1. Thanks for the guide. I altered your solution slightly because I didn’t want to disable caching for my whole site at all times but just when it was in maintenance mode. I did this by setting my maintenance page to a PHP script with the following at the top…

  2. How we can achieve to disable cache only when the website is in maintenance

    1. It already works this way. According to the above code, cache will be set conditionally — only when maintenance mode is enabled.

  3. Thank you for the steps.
    I do have a scenario I am curious how you would handle it.
    The scenario is to present the maintenance page early (full or embedded) or temporarily and the allow user to continue.

  4. Thank you for this. I have a script that I put in a controller that I need to run during maintenance mode. Will I be able to successfully hit the endpoint to execute this script while in maintenance mode?

  5. I think using the ErrorDocument for 503 error is much better. This will allow for user’s URL to simply «passthrough» and not redirect them to some maintenance URL. See this answer:

    https://stackoverflow.com/questions/622466/how-to-put-apache-website-to-503-temporary-down#5447534

    1. This is not an ideal approach for public websites where custom content for the maintenance effort needs to be displayed/communicated.

  6. Если на странице используется вызов style.css и другое подключение из файлов — такой вариант не работает. Вам необходимо будет переносить все скрипты и стили внутрь html — что не рекомендуется по W3C

  7. How can you allow favicon.ico to be processed normally — with your setup the browser’s request for favicon.ico is also rewritten to maintenance.html

    I tried added a !favicon.ico as a rewritecond, but it doesn’t seem to work.

Добавить комментарий