我尝试使用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页面。而是显示询问的页面。 我的重定向有什么问题吗?
答案 0 :(得分:5)
您似乎试图直接通过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);
}
答案 1 :(得分:1)
您无法设置503状态代码和重定向 - 这两者是互斥的,因为重定向使用3xx状态代码。
你可能想要更像的东西:
$response->setContent(file_get_contents('/path/to/maintenance.html'));
$response->setStatusCode(503);