подход для "сайта вниз для обслуживания" - PullRequest
5 голосов
/ 03 декабря 2009

Я использую Joomla, и мне очень нравится его административный объект, чтобы отключить сайт для технического обслуживания. Как я уже видел, все запросы к сайту, если он находится в режиме обслуживания, направляются на одну страницу. Как мне это сделать, если я хочу добавить свой собственный модуль «сайт закрыт на техническое обслуживание» для сайта, не принадлежащего Joomla? Я использую инфраструктуру MVC в PHP под названием Kohana в его версии 2, которая похожа на Codeigniter. У меня есть класс Маршрутизатор, где я могу контролировать, куда идет определенный адрес. Единственный подход, который я могу себе представить, - это перенаправлять каждый запрос к определенной функции контроллера, когда сайт не работает, но как мне это сделать? Я не могу вручную перенаправить все URL, верно?

Ответы [ 7 ]

9 голосов
/ 03 декабря 2009

Посмотрите на маршрутизацию документации . Вы должны иметь возможность использовать регулярное выражение, которое перенаправляет любой URI на определенный контроллер / действие. Остался только один вопрос: как включить или выключить это правило?

6 голосов
/ 04 декабря 2009

Кохана 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;
        }
    }
}

Или вы можете даже использовать систему ловушек для этого, добавив файл в папку 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-фреймворк:)

2 голосов
/ 03 декабря 2009

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

1 голос
/ 03 декабря 2009

Вы используете Apache? Добавьте это в ваш файл .htaccess в корневом веб-каталоге (или в объявлении vhost для сайта), чтобы перенаправить ВСЕ запросы на страницу «на обслуживании»:

Redirect 301 / /maintenace_page.html

0 голосов
/ 03 декабря 2009

Еще один метод переключения - проверка файла: если он существует, обслуживание начинается, поэтому отключите сайт.

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

0 голосов
/ 03 декабря 2009

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

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

0 голосов
/ 03 декабря 2009

Я могу придумать две идеи, чтобы это произошло.

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

  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

...