Php ZF2维护页面

Php ZF2维护页面,php,redirect,zend-framework2,maintenance,Php,Redirect,Zend Framework2,Maintenance,我尝试使用ZF2设置维护页面,但它不起作用。我在公用文件夹(www)中放置了一个maintenance.html页面,在onbootstrap函数中,我得到了以下代码: $config = $e->getApplication()->getServiceManager()->get('Appli\Config'); if($config['maintenance']) { $response = $e->getResponse();

我尝试使用ZF2设置维护页面,但它不起作用。我在公用文件夹(www)中放置了一个maintenance.html页面,在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']为true,则输入该选项,但它没有按预期显示我的maintenance.html页面。相反,它会显示所请求的页面。
我的重定向有什么问题吗?

您不能设置503状态码和重定向-这两者是互斥的,因为重定向使用3xx状态码

您可能想要更像:

$response->setContent(file_get_contents('/path/to/maintenance.html'));
$response->setStatusCode(503);

您似乎试图直接从
onBootstrap
方法短路请求。那是行不通的,在那一点上,路线还没有被解决,控制器也没有被调度。本质上,您所做的只是预先填充响应,只有在请求被路由和调度后才会重写响应

如果您想影响响应,您需要听另一个
MvcEvent
s。似乎您希望在调度控制器之前执行此操作,因此执行此操作的位置将在
事件_ROUTE
中,理想情况下具有较高的优先级,以便在路由器解析路由之前执行此操作(避免在解析决不调度的路由时浪费处理时间)

bootstrap上的公共函数(MvcEvent$e)
{
$events=$e->getApplication()->getEventManager();
$events->attach(MvcEvent::EVENT_路由,函数(MvcEvent$r){
$config=$r->getApplication()->getServiceManager()->get('Appli\config');
如果($config['maintenance'])){
$response=$r->getResponse();
//设置内容和状态
$response->setStatusCode(503);
$response->setContent(“服务不可用”);
//短路请求。。。
返回$response;
}
}, 1000);
}

这很奇怪,因为ZF2使用它来处理404错误,它工作得很好。尝试了setContent,即使没有文件\u get\u contents(将html代码直接作为setContent参数),它仍然保持不变。请求的页面仍然显示,并且内容没有更改:/事实上,我曾经在onBootstrap中短路请求以获得ACL权限,并且不知何故想要对维护页面执行相同的操作。你的解决方案很好,我喜欢你削减无用流程的方式。非常感谢你的帮助和解释
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);
}