Как получить 404 код? Laravel выдает код ответа сервера 500 вместо 404

Laravel

Проблема: Когда открываешь 404 страницу или любую другую несуществующую, сервер выдает код ответа 500, вместо 404. Решение очень простое, нужно было всего лишь изменить одну строчку запроса к базе данных.

Содержание статьи

    Проблема: Код ответа сервера 500 вместо 404. Как получить 404 код ошибки?

    Когда открываешь 404 страницу или любую другую несуществующую, сервер выдает код ответа 500, вместо 404.

    А для SEO нам особенно важно получить код ответа сервера, который соответствует состоянию страницы.

    Давайте посмотрим с точки зрения поисковиков на данную ситуацию.

    Если пользователь ошибся адресом страницы, а ему сервер выдает 500 ошибку, вместо 400.

    Поисковые роботы это фиксируют и считывают это так, что пользователь отправил правильный запрос на страницу, а сервер не смог выполнить его запрос.

    В таком случае, роботы поставят вашему сайту «минус», а вам такая ситуация не нужна.

    Если пользователь ошибся страницей и получил код ошибки 404, то поисковый робот считает эту ситуацию как ошибку клиента и вашему сайту это не зачтется как «минус».

    Решение

    Проблема была в способе получения записи из базы данных.

    Запись из БД вытаскивалась таким способом и причина ошибки в данной записи:

    $post = Post::where('slug', $slug)->first();

    И что происходило. Пользователь вводит несуществующую страницу, а сервер этого не понимает и продолжает ее обрабатывать, искать в базе данных соответствующую запись.

    Но запрос он выполнить не может, ведь такой записи нет и он выдает 500 ошибку и сообщает, что Trying to get property 'id' of non-object.

    То есть проблема заключалась в том, что запрос не останавливался, а его надо остановить и выдать 404 ошибку на том моменте, когда происходит первый запрос к базе данных.

    Поэтому, вместо выше указанной строчки, нужно написать

    $post = Post::where('slug', $slug)-> firstOrFail();

    firstOrFail() - возвращает первую запись, найденную в базе данных. Если подходящей модели не существует, выдается ошибка.

    first() - возвращает первую запись, найденную в базе данных. Если подходящей модели не существует, возвращается null.