it-roy-ru.com

Исключение Laravel 4: NotFoundHttpException

Журналы моего приложения Laravel 4 иногда показывают NotFoundHttpException:

exception 'Symfony\Component\HttpKernel\Exception\NotFoundHttpException' in /var/www/laravel4/bootstrap/compiled.php:7420
Stack trace:
#0 /var/www/laravel4/bootstrap/compiled.php(7137): Illuminate\Routing\Router->handleRoutingException(Object(Symfony\Component\Routing\Exception\ResourceNotFoundException))
#1 /var/www/laravel4/bootstrap/compiled.php(7113): Illuminate\Routing\Router->findRoute(Object(Illuminate\Http\Request))
#2 /var/www/laravel4/bootstrap/compiled.php(958): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#3 /var/www/laravel4/bootstrap/compiled.php(946): Illuminate\Foundation\Application->dispatch(Object(Illuminate\Http\Request))
#4 /var/www/laravel4/public/index.php(49): Illuminate\Foundation\Application->run()
#5 {main}

Что могло вызвать это? Трассировка стека ничего не показывает из моего кода.

12
Nyxynyx

NotFoundHttpException - это просто 404 в вашем приложении. К сожалению, сообщение об исключении даже не сообщает вам URL запроса, который вызвал исключение, что затрудняет понимание этих ошибок, когда вы видите их в своих журналах.

Чтобы дать вам больше информации об отладке, настройте собственный обработчик 404. Вот простой обработчик, который будет регистрировать URL (чтобы вы знали, что было запрошено, чтобы вызвать ошибку) и пользовательский агент (чтобы помочь вам выяснить, кто или что сделал запрос) и возвращать представление и код 404:

App::missing(function($e) {
    $url = Request::fullUrl();
    $userAgent = Request::header('user-agent');
    Log::warning("404 for URL: $url requested by user agent: $userAgent");
    return Response::view('errors.not-found', array(), 404);
});

Поместите это в app/start/global.php.

25
Andreas

Я получил эту проблему, потому что я прописал название родительского каталога и не прописал его в URL. Вот почему я получил ошибку.

Я использовал этот URL localhost/laravel/todo2/public/foo И фактически он работал, если все, что я набрал, было: localhost/Laravel/todo2/public/ но если я напишу что-нибудь после публики/это выдаст эту ошибку.

если бы я использовал это с заглавной буквы Laravel localhost/Laravel/todo2/public/foo  

маршруты после публики/будут работать

3
Mark

Вы можете отфильтровать ошибку 404 (NotFoundHttpException) из вашего файла журнала.
Расположение файла: app/start/global.php

App::error(function(Exception $exception, $errorCode)
{
    $requestUrl = Request::fullUrl(); 
    $userAgent = Request::header('user-agent');

    if($errorCode != 404){
        Log::error('Exception', array(
            'errorCode' => $errorCode,
            'requestUrl' => $requestUrl,
            'userAgent' => $userAgent,
            'context' => $exception,
        ));     
    }

    return Response::view('error-page-path.error-404', array(), 404);
    // Here "error-404" is a blade view file in "error-page-path" directory
});
1
Shojib Flamon

Мой проект находится в C:\xampp\htdocs\ColorTex

Я получил эту ошибку, набрав 

http://localhost/myproject/public/image 

вместо

http://localhost/MyProject/public/image 

Я в окнах, поэтому я думал, что это будет игнорировать заглавные буквы, но ...

Будьте осторожны с этим.

1
Combine

Действительно трудно сказать наверняка, что вызывает это, не зная вашего кода. Глядя на трассировку стека ошибки, становится ясно, что маршрутизатор отправляет ее, и я полагаю, что это не имеет ничего общего с самим фоновым заданием, а скорее с API, которые он вызывает.

В вашем конкретном случае исключение является throw после ResourceNotFoundException , что происходит, когда для такого шаблона URL не определен маршрут.

Возможные проблемы:

Если фоновое задание выполняет file_get_contents или curl в ваших собственных API, оно может вызывать несуществующий маршрут и затем генерировать это исключение.

Если у вас нет контроля над URL-адресом, загружаемым фоновым заданием, возможно, он пытается извлечь URL-адрес, например 127.0.0.1, localhost или что-то подобное.

1
vFragosop

Я получил эту ошибку, потому что я использовал method = "post" в моей форме вместо method = "POST". 

Может быть кому-то пригодится.

0
xyLuz