подход к “остановке сайта для технического обслуживания”

StackOverflow https://stackoverflow.com/questions/1838019

  •  11-09-2019
  •  | 
  •  

Вопрос

Я использую 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

Я могу придумать две идеи, как это осуществить.

  1. Как сказал Ларри, используйте регулярные выражения для перенаправления всех запросов в определенное место.Итак, сначала вы должны определить, находится ли сайт в режиме обслуживания (возможно, используя флаг базы данных или настройку конфигурационного файла), затем, если это так, используйте функцию маршрутизации с регулярным выражением, чтобы перенаправить весь трафик в одно место.

  2. Вы могли бы проверить, находится ли сайт в режиме обслуживания в конструкторе каждого контроллера, и перенаправить по мере необходимости.Вероятно, это не самое оптимальное решение, поскольку вы будете повторять один и тот же код для каждого контроллера.Таким образом, даже если бы это сработало, вам, вероятно, было бы лучше использовать регулярные выражения.

Маршрутизация в Кохане: 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, и все запросы будут перенаправляться на вашу страницу обслуживания.

Посмотрите на Событие / Документация по подключению для получения дополнительной информации о создании хука.

Другим способом переключения этого параметра является проверка наличия файла:если он существует, начинается техническое обслуживание, поэтому выключите сайт.

Если это так, вы можете сделать все, что указано выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top