Страница технического обслуживания ZF2
Я пытаюсь настроить страницу обслуживания с помощью ZF2, но она не работает. Я положил maintenance.html страница в общей папке (www) и в моей функции onbootstrap у меня есть следующий код:
$config = $e->getApplication()->getServiceManager()->get('Appli\Config');
if($config['maintenance']) {
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', '/maintenance.html');
$response->setStatusCode(503);
return $response;
}
Я ввожу, если причина $config['обслуживание'] верна, но она не отображает мой maintenance.html страница, как и ожидалось. Вместо этого он отображает запрошенную страницу. Что-то не так с моим перенаправлением?
2 answers
Похоже, вы пытаетесь замкнуть запрос напрямую с помощью вашего метода onBootstrap
. Это не сработает, в этот момент маршрут не был решен, и контроллер не был отправлен. По сути, все, что вы делаете, - это предварительное заполнение ответа, только для того, чтобы он был перезаписан после того, как запрос будет направлен и отправлен.
Если вы хотите повлиять на ответ, вам нужно будет прослушать один из других MvcEvent
. Похоже, вы хотите сделать это до того, как контроллер будет отправлено, поэтому место для этого должно быть в EVENT_ROUTE
, в идеале с высоким приоритетом, чтобы это произошло до того, как маршрут будет разрешен маршрутизатором (экономит потраченную впустую обработку, разрешающую маршрут, который никогда не будет отправлен).
public function onBootstrap(MvcEvent $e)
{
$events = $e->getApplication()->getEventManager();
$events->attach(MvcEvent::EVENT_ROUTE, function (MvcEvent $r) {
$config = $r->getApplication()->getServiceManager()->get('Appli\Config');
if ($config['maintenance']) {
$response = $r->getResponse();
// set content & status
$response->setStatusCode(503);
$response->setContent('<h1>Service Unavailable</h1>');
// short-circuit request...
return $response;
}
}, 1000);
}
Вы не можете установить код состояния 503 и перенаправление - эти два являются взаимоисключающими, так как перенаправления используют код состояния 3xx.
Вы, вероятно, хотите чего-то большего, например:
$response->setContent(file_get_contents('/path/to/maintenance.html'));
$response->setStatusCode(503);