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}

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

Ответ 1

A 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.

Ответ 2

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

Я использовал этот url локальный/Laravel/todo2/открытый/Foo и на самом деле это сработало, если все, что я набрал, было: локальный/Laravel/todo2/государственный/ но если я напечатал что-нибудь после публики/это дало бы эту ошибку.

если я использовал это с заархивированным Laravel localhost/Laravel/todo2/public/foo

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

http://localhost/myproject/public/image

вместо

http://localhost/myproject/public/image

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

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

Ответ 5

Вы можете отфильтровать ошибку 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
});

Ответ 6

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

Может быть полезно кому-то.