Страница технического обслуживания 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 страница, как и ожидалось. Вместо этого он отображает запрошенную страницу. Что-то не так с моим перенаправлением?

Author: Traperac, 2014-05-02

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);
}
 5
Author: Crisp, 2015-09-12 16:27:24

Вы не можете установить код состояния 503 и перенаправление - эти два являются взаимоисключающими, так как перенаправления используют код состояния 3xx.

Вы, вероятно, хотите чего-то большего, например:

$response->setContent(file_get_contents('/path/to/maintenance.html'));
$response->setStatusCode(503);
 1
Author: Tim Fountain, 2014-05-02 19:38:06