Правильная отдача заголовка 503 для отключенного сайта на примере движка DataLife Engine.
Время от времени каждому Веб-мастеру приходится отключать свой сайт от пользователей на техническое обслуживание. Например обновление движка, или внесение и тестирование каких либо серьёзных изменений на сайте.
В нашей статье рассматривается пример с использованием популярного в России движка DataLife Engine (сокращенно и далее по тексту DLE). В данном движке предусмотрена специальная возможность отключить сайт на время работ, при этом если зайти на сайт, то мы получим специальную страничку с текстом оповещения, что сайт находится на техническом обслуживании.
Все кажется замечательно придумали разработчики!
Но некоторое время назад я столкнулся с одной интересной проблемой, с которой решил поделиться с Вами и соответственно внести небольшое изменение в код, для исправления той самой проблемы.
На одном из моих сайтов на движке DLE надо было провести большое обновление нескольких важных файлов. Соответственно что бы посетитель случайно не получил фатальную ошибку или в лучшем случае чистый лист, я временно перевел сайт в режим Offline. Таким образом каждый заходящий на сайт, вместо главной странички получал информацию о том, что на сайте проводится техническое обслуживание. Данное обслуживание длилось минут 10-15, но этого времени хватило что бы случилось "чудо"!
В это время на сайт пришел Робот Яндекса и проиндексировал страничку с текстом о "Техническом обслуживании", что через некоторое время привело к попаданию в индекс Яндекса главной странички с данным временным содержанием!
Почему так произошло?
Я начал разбираться, если Яндекс проиндексировал страничку, значит сайт отдает заголовок с кодом 200. Что я первым делом и проверил. Конечно в ответе сервера, при отключенном сайте я получил тот самый не верный код заголовка 200. Код 200 дает понять роботу, простыми человеческими словами: "все хорошо, страничка такая есть, можно индексировать...".
Но постойте, сайт на техническом обслуживании! Он временно закрыт! Значит не только пользователи, но и роботы должны знать, что "Сайт временно закрыт".
И что теперь делать?
А вот для этого случая как раз существует правильный код заголовка 503, который простыми словами дает понять роботу что "Сайт временно на техническом обслуживании, зайдите позже..". Время на которое это "позже" может затянутся - мы можем указать в коде сами. Робот принимает эту информацию и зайдет немного позже..
И так рассмотрим PHP код, который необходимо вставить для правильного ответа при отключенном сайте:
$protocol = "HTTP/1.0";
if ( $_SERVER["SERVER_PROTOCOL"] == "HTTP/1.1" ) $protocol = "HTTP/1.1";
header( "$protocol 503 Service Unavailable", true, 503 );
header( "Retry-After: 3600" );
Вначале мы проверим какой версии протокола использует сервер и соответственно вставим в 3-ю строку.
Собственно 3-я строка со вставленным из переменной $protocol версией протокола сервера и отправляет заголовок с кодом 503.
header( "$protocol 503 Service Unavailable", true, 503 );
А вот 4-ая строка с кодом:
header( "Retry-After: 3600" );
Как раз "говорит" Роботу - "повторите попытку после 3600 секунд..."
Куда вставить этот код в DataLife Engine что бы отдавать правильно заголовок?
Теперь открываем файл, который находится по следующему пути:
/engine/modules/offline.php
Находим код:
@header("Content-type: text/html; charset=".$config['charset']);
И сразу после него вставляем наш код:
$protocol = "HTTP/1.0";
if ( $_SERVER["SERVER_PROTOCOL"] == "HTTP/1.1" ) $protocol = "HTTP/1.1";
header( "$protocol 503 Service Unavailable", true, 503 );
header( "Retry-After: 3600" );
Соответственно время 3600 в секундах, вы можете поставить своё.
Вот таким образом легко и просто мы грамотно оповестим как посетителей, так и поисковых роботов о том, что сайт временно не доступен и зайдите позже!
Спасибо за Внимание!
Автор данной статьи
Администратор сайта 0lik.ru
Александр
При перепечатке ссылка на источник обязательна!