Редирект несуществующих страниц на URL /404 в роутинге на PHP

Всем здравствуйте.

Не могу справиться с редиректом несуществующих URL на URL /404. Именно на URL /404 с отдачей заголовка Not Found 404.

Уже и инклюдил 404.php, и Location /404 задавал, не выходит нормально сделать. Бьюсь третий день...

Что требуется

  • все несуществующие URL редиректить на URL /404
  • отправлять клиенту заголовок Not Found 404
  • инклюдить страницу (шаблон /pages/404.php)
  • желательно триммить конечные слеши /, чтобы не было такого: /about/

Что имеется:

Содержание htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

Содержание index.php

/* Обработка ЧПУ-запросов */
class Router {
    private $_route = array(); // Переменная хранит маршруты, и файлы, которые будут открываться при определеном маршруте

    public function setRoute($dir, $file) {
        $this->_route[trim($dir, '/')] = $file;
    }

    public function route() {
        if (!isset($_SERVER['PATH_INFO'])) { // Если открыта главная страница
            include './pages/mainpage.php'; // Открываем файл главной страницы
        } elseif (isset($this->_route[trim($_SERVER['PATH_INFO'], '/')])) { // Если маршрут задан
            include $this->_route[trim($_SERVER['PATH_INFO'], '/')]; // Открываем файл, для которого установлен маршрут
        }
        else return false; // Если маршрут не задан

        return true;
    }
}

$route = new Router;

/***************/
/* URL -> файл */
/***************/

/* Страницы */
//$route->setRoute('page-01', "./pages/page-01.php"); // Страница 01
$route->setRoute('page-02', "./pages/page-02.php"); // Страница 02
$route->setRoute('page-03', "./pages/page-03.php"); // Страница 03
$route->setRoute('page-04', "./pages/page-04.php"); // Страница 04

/* Статьи */
//$route->setRoute('article-1', "./articles/article-001.php"); // Статья №001
//$route->setRoute('article-2', "./articles/article-002.php"); // Статья №002

/* Страница 404 */
$route->setRoute('404', "./pages/404.php"); // 404
if (!$route->route()) { // Если URL не найден
    header("HTTP/1.1 404 Not Found");
    header("Location: /404");
    exit();
}

Ответы (1 шт):

Автор решения: Slava

Т.к. вы используете .htaccess, то можно там прописать: ErrorDocument 404 /pages/404.php c включенным RewriteEngine on

header($_SERVER['SERVER_PROTOCOL'] . " 404 Not Found"); с exit();

http_response_code(404);
include('/pages/404.php');
exit();
→ Ссылка