подход к “остановке сайта для технического обслуживания”
Вопрос
Я использую Joomla, и мне нравятся ее административные возможности для вывода сайта из эксплуатации.Как я уже видел, все запросы к сайту, если он находится в режиме обслуживания, перенаправляются на одну страницу.Если я хочу добавить свой собственный модуль "сайт закрыт на обслуживание" для сайта, отличного от Joomla, как мне это сделать?Я использую фреймворк MVC на PHP под названием Kohana в его версии 2, которая аналогична Codeigniter.У меня есть класс маршрутизатора, где я могу контролировать, куда идет определенный адрес.Единственный подход, который я могу придумать, - перенаправлять каждый запрос к определенной функции контроллера, когда сайт не работает, но как мне это сделать?Я же не могу вручную перенаправить все URL-адреса, верно?
Решение
Кохана 3:Вы можете определить универсальный маршрут в своем bootstrap.php
до того, как Kohana::modules()
линии:
if (/* check if site is in under maintenance mode */) {
Route::set('defaulta', '(<id>)', array('id' => '.*'))
->defaults(array(
'controller' => 'errors',
'action' => 'maintenance',
));
}
Или вы даже можете перепутать запрос, чтобы сделать то же самое:
if (/* check if site is in under maintenance mode */) {
echo Request::factory('errors/maintenance')
->execute()
->send_headers()
->response;
}
Кохана 2:Вам нужно было бы расширить Controller
и обработайте отображение страницы "в процессе обслуживания" в конструкторе (но вам нужно убедиться, что все ваши контроллеры расширяют этот класс контроллера вместо ванильного):
abstract class Custom_Controller extends Controller {
public function __construct()
{
parent::__construct();
if (/* check if site is in under maintenance mode */) {
$page = new View('maintenance');
$page->render(TRUE);
exit;
}
}
}
Или вы даже можете использовать для этого систему hook, добавив файл в свой hooks
папка (убедитесь, что вы включили перехваты в вашем config.php
):
Event::add('system.ready', 'check_maintenance_mode');
function check_maintenance_mode() {
if (/* check if site is in under maintenance mode */) {
Kohana::config_set('routes', array('_default' => 'errors/maintenance'));
}
}
Как вы можете видеть, на самом деле есть много способов, как делать что-то в Kohana, потому что это очень гибкий PHP фреймворк :)
Другие советы
Взгляните на маршрут Документация.Вы должны иметь возможность использовать регулярное выражение, которое перенаправляет любой uri на определенный контроллер / действие.Единственный оставшийся вопрос заключается в том, как включить / выключить это правило.
Вы могли бы проверить флаг базы данных в общем заголовке (предположительно, у вас есть какое-то общее включение, которое подключается к базе данных и т.д.), И если флаг установлен, отобразить определенную страницу и выйти (обязательно выполнив все обычные действия по очистке, такие как закрытие соединений с базой данных и т.д.).
Вы используете Apache?Добавьте это в свой .htaccess
файл в корневом каталоге вашего веб-сайта (или в объявлении vhost для сайта), чтобы перенаправлять ВСЕ запросы на страницу "в процессе обслуживания":
Redirect 301 / /maintenace_page.html
Я могу придумать две идеи, как это осуществить.
Как сказал Ларри, используйте регулярные выражения для перенаправления всех запросов в определенное место.Итак, сначала вы должны определить, находится ли сайт в режиме обслуживания (возможно, используя флаг базы данных или настройку конфигурационного файла), затем, если это так, используйте функцию маршрутизации с регулярным выражением, чтобы перенаправить весь трафик в одно место.
Вы могли бы проверить, находится ли сайт в режиме обслуживания в конструкторе каждого контроллера, и перенаправить по мере необходимости.Вероятно, это не самое оптимальное решение, поскольку вы будете повторять один и тот же код для каждого контроллера.Таким образом, даже если бы это сработало, вам, вероятно, было бы лучше использовать регулярные выражения.
Маршрутизация в Кохане: http://docs.kohanaphp.com/general/routing
Регулярные выражения PHP: http://www.php.net/manual/en/reference.pcre.pattern.syntax.php
Контроллеры в Кохане: http://docs.kohanaphp.com/general/controllers
В вашем index.php определите константу с именем IN_MAINTENANCE
Создайте обратный вызов следующим образом в файл с крючком:
function in_maintenance()
{
if(IN_MAINTENANCE)
{
Router::$controller = 'my_maintenance_controller';
Router::$method = 'index';
}
}
И добавьте его как в событие system.post_routing.
Event::add('system.post_routing', 'in_maintenance');
Когда вы загружаете свой сайт, измените значение IN_MAINENANCE на TRUE, и все запросы будут перенаправляться на вашу страницу обслуживания.
Посмотрите на Событие / Документация по подключению для получения дополнительной информации о создании хука.
Другим способом переключения этого параметра является проверка наличия файла:если он существует, начинается техническое обслуживание, поэтому выключите сайт.
Если это так, вы можете сделать все, что указано выше.