Laravel 4 - 仅针对缺失页面的自定义404错误处理

时间:2014-06-12 13:30:47

标签: php laravel laravel-4

在Laravel 4.1中,如果页面不存在,我想将用户重定向到我自定义的404页面。这很简单,因为我已经有了这个:

App::missing(function($exception)
{
    return Redirect::to('error404', 303)->with(array('error' => array('url' => Request::url())));
}

但问题是,如果页面上缺少任何链接文件(图像,js,css等),那么该文件不会出现404错误,但这会在控制台上显示:

Resource interpreted as Image but transferred with MIME type text/html: "...

所以问题是:如果页面丢失,我怎么能删除404并保留其余部分的默认错误处理(图像,其他文件等)?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您无法重定向到其他网址,但仍会显示404错误的自定义页面,并直接在HTTP 404 Status Code内发送App::missing,如下所示:

App::missing(function() {
    return Response::make(View::make('error404'), 404);
});

这会在加载页面时显示正确的视图,但由于HTTP 404 Status Code而强制浏览器在尝试加载资源时抛出错误。

在Chrome 35上,我在尝试加载img标记中的图片时在控制台上收到此错误:

GET http://testing.app:8000/test 404 (Not Found)

答案 1 :(得分:0)

我会检查Request方法中App::missing想要的内容。不确定这是否可以直接使用,但它是一个开始。

App::missing(function($exception)
{
    if( Request::format() == 'text/html' )
        return Redirect::to('error404', 303)->with(array('error' => array('url' => Request::url())));
}

修改

由于上面的代码没有做你想要的,我把它修改为其他东西。感觉就像一个黑客,我不建议在生产中使用它;我建议寻找更好的方法来做到这一点,但我认为这将有效。 (它适合我)

App::missing(function($exception)
{
    $uri = Request::getRequestUri();
    $ext = explode(".", $uri);

    if( preg_match("/(jpg|gif|png|tif)/", end($ext)) !== 1 )
        return Redirect::to('error404', 303)->with(array('error' => array('url' => Request::url())));
});

这很难做到的部分原因是因为应用程序不知道返回的请求字符串是什么。例如,/images/FJB3cB09的请求uri可能是图像。 /images/my-profile.jpg的uri不一定必须返回JPEG图像。在读取文件内容之前,它不知道内容类型是什么;如果找不到文件,那么您无法准确地告诉您要访问的内容。有意义吗?