【问题标题】:Laravel 4 - custom 404 error handling only for missing pagesLaravel 4 - 仅针对缺失页面的自定义 404 错误处理
【发布时间】:2014-06-12 13:30:47
【问题描述】:

在 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 并为其余页面(图像、其他文件等)保留默认错误处理?

提前致谢!

【问题讨论】:

  • 也许如果你传递404作为状态码,这意味着页面没有找到,而不是303,这意味着你正在重定向,浏览器可能会理解并正常工作。
  • 没有。它必须是 303,因为它是重定向。如果我将其更改为 404,它会抛出:“异常处理程序中的错误:HTTP 状态代码不是重定向(给出“404”)。”
  • 它应该真的返回 404,不是吗?既然是这样?也许像在 error404 路由中那样在 App::missing 内创建视图并返回 404 是正确的选择。
  • 没有。仅当缺少任何内容但不是网页时,我才想要 404 错误。如果页面丢失,它应该重定向到自定义错误页面(当前所做的)。
  • 您可以显示自定义错误页面并发送 404 状态码。这可能会给你同样的结果。

标签: php laravel laravel-4


【解决方案1】:

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

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)

【讨论】:

  • 问题是自定义错误页面有一个带有一些逻辑的控制器。如果我直接在missing() 中创建一个视图,那么它的控制器将不会执行。我错了吗?
  • 然后将逻辑复制到App::missing
【解决方案2】:

我会检查RequestApp::missing 方法中想要什么。不确定这是否可以开箱即用,但这是一个开始。

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

编辑

由于上面的代码不能满足您的要求,因此我将其修改为其他内容。感觉就像是 hack,我不建议在生产中使用它;我建议寻找一种更好的方法来做到这一点,但我认为这会奏效。 (对我有用)

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 图像。在读取文件内容之前,它无法知道内容类型是什么;如果没有找到文件,那么您将无法准确判断您要访问的内容。有意义吗?

【讨论】:

  • 如果我“dd()”而不是“text/html”,则 Request::format() 是 'html'。但没关系,因为它不起作用。如果我尝试打开例如。 dev.local/images/pic.png 将是相同的...我的意思是相同的“html”响应,Laravel 运行自定义 404。此外,如果我打开一个存在但包含丢失图像链接的页面,我会在控制台上得到相同的错误,就像我提到的在我原来的问题中。
  • 您可以使用Request::header('Accept') 尝试类似的操作,但我怀疑它是否可靠。
  • @Goldentoa11 是的,它有效,谢谢,我完全同意,你说得对,它看起来有点像黑客......我会等待另一个答案,如果没有更好,我会接受你的解决方案。
猜你喜欢
  • 2013-12-08
  • 2019-08-08
  • 2012-03-26
  • 1970-01-01
  • 2016-04-25
  • 2013-09-16
  • 2014-05-26
  • 1970-01-01
相关资源
最近更新 更多