В этой статье я хочу исправить одну из моих ошибок, точнее не совсем ошибку, просто не очень удачный совет.
Дело в том, что недавно я просматривал собственные посты и заметил, что в одном из них задача решается далеко не лучшим образом. Речь шла о блокировке доступа к блогу на движке WordPress.
Решение, которое я тогда предложил, работоспособное и им вполне можно пользоваться. Но только какое-то оно сложное 🙂
Нужно было использовать несколько файлов .htaccess для разных папок блога. Доступ для администратора получался немного ограниченным, например, статические ссылки не работали.
И, самое главное. Как абсолютно верно заметил Олег Лобач в комментариях к тому посту, если сайт закрыт на обслуживание, то необходимо отправлять заголовок с 503 кодом (Service Unavailable).
Для посетителей этот код роли не играет, они все равно увидят страницу с описанием ошибки, но вот поисковые боты – другое дело. Думаю, никому не захочется, чтобы в индекс поисковика попала фраза «Зайдите позже» вместо контента блога.
В общем, сейчас хочу рассказать о другом, на мой взгляд, более удачном решении.
Нужно будет выполнить всего два шага.
1) Создать страницу, которую будем показывать посетителям во время обслуживания сайта.
2) Добавить пару строк в файл .htaccess, который находится в корне блога.
Кстати, этот метод подойдет практически для любого сайта не зависимо от используемого движка.
Идея заключается в ограничении доступа на основании IP адреса. Т.е. при попытке доступа к сайту web сервер (apache) проверит ваш IP и если он не совпадет с заданным, то все запросы будут перенаправлены на специальную страницу.
Итак, приступим.
Шаг 1. Создаем страницу с сообщением о том, что сайт временно закрыт.
Назовем её maintain.php и разместим в корне сайта.
<?php header('HTTP/1.0 503 Service Unavailable'); header('Retry-After: 3600'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Обслуживание сайта</title> </head> <body> <h1>Извините, в данный момент сайт закрыт на обслуживание</h1> <p>Зайдите немного позже</p> </body> </html>
Обсуждать тут особенно нечего. Саму страницу, конечно, лучше оформить в соответствии с общим дизайном сайта.
Но сейчас важнее заголовки (строки 2 и 3). Для их отправки используется стандартная функция PHP — header
. В её первом параметре указываем заголовок.
Первый заголовок отправляет 503 HTTP код, а второй (Retry-After) – время, через которое рекомендуется обновить страницу. В данном примере я установил 1 час (3600 сек), но вы можете выбрать любой интервал времени по своему усмотрению.
Шаг 2. Определяем собственный IP.
Тут ситуация следующая. Если у вас статический IP адрес, то вы его знаете и определять ничего не надо 😉
Но большинство интернет провайдеров просит за него дополнительные деньги. И если вы эту услугу не заказывали, то при подключении IP адрес будет выдаваться вам каждый раз новый (на практике он меняется довольно редко).
Узнать текущий IP-шник можно с помощью online-сервисов, например: whatismyip.com или mymainip.com.
Шаг 3. Делаем резервную копию файла .htaccess.
Например, с названием .htaccess_main
.
Шаг 4. Добавляем проверку IP.
В качестве примера, рассмотрим .htaccess, который часто используется в блогах на WordPress.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Примечание. Правила в этом файле подходят для любого движка, в котором запросы обрабатываются скриптом index.php. Например, для сайтов, использующих фреймворк CodeIgniter такой .htaccess тоже вполне подойдет.
Добавляем две дерективы после RewriteBase /
RewriteCond %{REMOTE_ADDR} !=127.0.0.2 RewriteRule ^.* maintain.php [L]
Т.е. в результате получится.
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REMOTE_ADDR} !=127.0.0.1 RewriteRule ^.* maintain.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule>
Естественно, вместо 127.0.0.1 нужно указать свой реальный IP адрес.
Принцип работы предельно простой. В директиве RewriteCond
(строка 5) мы сравниваем IP адрес посетителя с указанным. И если они не совпадают – отправляем посетителя на maintain.php
(строка 6). Буква L
в квадратных скобках указывает, что если это правило выполнилось, то обработку запроса нужно прекратить. Т.е. все последующие строки будут проигнорированы.
Если же вы сами заходите на сайт (IP-шники совпадают), то директива RewriteRule
(в строке 6) пропускается и web сервер обрабатывает запрос как обычно.
Шаг 5. Восстанавливаем доступ к сайту.
Для этого просто восстанавливаем старый .htaccess файл из резервной копии.
Небольшое дополнение.
Если в процессе работы у вас изменится IP адрес, то вам нужно повторить шаг 2, создать .htaccess с новым IP и скопировать его в корень сайта по FTP.
Вот и все!
Все вопросы и замечания оставляйте в комментариях. Буду рад ответить или обсудить 🙂
До встречи!