Я пытаюсь настроить страницу обслуживания с 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; }
Я вхожу в аргумент if. $ Config ['maintenance'] имеет значение true, но не отображает мою страницу maintenance.html, как и ожидалось. Вместо этого отображается страница с запросом. Что-то не так в моем перенаправлении?
Кажется, вы пытаетесь коротко onBootstrap
запрос непосредственно из метода onBootstrap
. Это не сработает, в этот момент маршрут не был разрешен и контроллер не был отправлен. По сути, все, что вы делаете, это предварительное заполнение ответа, только для того, чтобы оно было переписано после того, как запрос будет перенаправлен и отправлен.
Если вы хотите повлиять на ответ, вам нужно будет прослушать один из других MvcEvent
s. Кажется, вы хотите сделать это до отправки диспетчера, поэтому место для этого будет в 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);