Редирект несуществующих страниц на 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();