Я использую Joomla, и мне нравится его административное средство, чтобы разместить сайт для обслуживания. Как я видел, все запросы на сайт, если он находится в режиме обслуживания, перенаправляются на одну страницу. Если я хочу добавить свой собственный модуль «сайт вниз для обслуживания» для сайта без Joomla, как мне это сделать? Я использую структуру MVC в PHP, названную Kohana в ее версии 2, которая похожа на Codeigniter. У меня есть класс Router, где я могу контролировать, куда идет определенный адрес. Единственный подход, который я могу думать, – перенаправить каждый запрос на конкретную функцию контроллера, когда сайт не работает, но как это сделать? Я не могу вручную перенаправить все URL-адреса правильно?
Kohana 3 : вы можете определить маршрут catch-all в вашем 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 */) { 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; }
Kohana 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')); } }
Как вы можете видеть, на самом деле существует много способов сделать вещи в Кохане, потому что это очень гибкая фреймворк PHP 🙂
Взгляните на документацию по маршрутизации. Вы должны иметь возможность использовать регулярное выражение, которое перенаправляет любой uri на определенный контроллер / действие. Осталось только вопрос о том, как включить или отключить это правило.
Вы можете проверить флаг базы данных в общем заголовке (предположительно, у вас есть некоторые общие include, которые подключаются к базе данных и т. Д.), И если флаг установлен, выведите определенную страницу и выйдите (убедитесь, что все обычные вещи очистки например закрытие соединений с базой данных и т. д.)
Вы используете 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
Создайте обратный вызов, например, в файле hook :
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, и все запросы будут перенаправлены на вашу страницу обслуживания.
Дополнительную информацию о создании крючка см. В документации Event / Hook .
Другим способом переключения является проверка файла: если он существует, начинается обслуживание, поэтому отключите сайт.
Если это так, вы можете сделать что-либо из перечисленного выше.