Как оформить страницу ошибки 404

147
14 ноября 2019, 23:10

У меня есть сайт, зеркало другого сайта.

Мне нужно оформить страницу ошибки 404 для данного сайта, так как это тоже учитывается поисковыми системами для SEO продвижения. Сайт построен на собственном фреймворке.

И да, файл .htaccess лежит в корне сайта.

Я пробовал 2 способа:

  • в файле .htaccess прописать ErrorDocument 404 ~directory/404.php (соответственно что вместо директории абсолютный путь к файлу чезер домен.

  • второй способ, я создал контроллер и роут на error, и в случае любой ошибки через файл .htaccess я перенаправлял на /error однако такая запись также ничего не дала.

Подскажите, как можно решить мою проблему, а так же, какие скрины и части кода нужно прикрепить?

Вот код .htaccess:

AddDefaultCharset utf-8
#
RewriteEngine on

RewriteBase /
AddType image/x-icon .png 
RewriteCond %{HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
RewriteRule ^sitemap\.xml$ sitemap.xml [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php

Вот код роутера, со всеми преобразованиями:

<?php
/**
 * Created by PhpStorm.
 * User: USER
 * Date: 20.02.2019
 * Time: 19:40
 */
class Router
{
    private $routes;
    public function __construct()
    {
        $routePath = ROOT . '/config/routes.php';
        $this->routes = include($routePath);
    }
    // Return Type
    private function getURI()
    {
        if(!empty($_SERVER['REQUEST_URI'])) {
            return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run()
    {
        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path){
            if (preg_match("~$uriPattern~", $uri)) {
                // Получаем внутренний путь их внешнего согласно правилу
                $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                $segments = explode('/', $internalRoute);
                $controllerName = array_shift($segments).'Controller';
                $controllerName = ucfirst($controllerName);
                $actionName = 'action'.ucfirst(array_shift($segments));
                $parameters = $segments;
                $controllerFile = ROOT . '/controllers/' . $controllerName . '.php';
                if (file_exists($controllerFile)) {
                    include_once ($controllerFile);
                }
                $controllerObject = new $controllerName;
                $result = call_user_func_array(array($controllerObject, $actionName), $parameters);
                if ($result != null) {
                    break;
                }
            }
        }
    }
}

Вот сам файл index.php:

<?php
/**
 * Created by PhpStorm.
 * User: USER
 * Date: 20.02.2019
 * Time: 17:59
 */
// FRONT CONTROLLER
// Общие настройки
session_start();
// Подключение файлов системы
define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/Autoload.php');
//Вызов Router
$router = new Router();
$router->run();
Answer 1

Фрагмент ниже говорит что любой запрос к несуществующему файлу будет отправлен на обработку в index.php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php

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

Значит это вы должны выдавать код 404 если страница вам неизвестна. Подходящим местом это сделать будет конец функции run():

public function run()
{
    $uri = $this->getURI();
    foreach ($this->routes as $uriPattern => $path) {
        // обычное содержимое функции...             
    }
    // затем, в самом конце
    if (!isset($result) || $result === null) {
        // подадим соответствующий HTTP код
        http_response_code(404);
        // опционально показываем что-то на странице
    }
}
READ ALSO
Два связанных &lt;select&gt; без js. Возможно ли?

Два связанных <select> без js. Возможно ли?

У меня есть сейчас список <select>, который функционирует для вывода таблиц с информациейНужен ещё , который будет списком ников

131
С++ Обмен данными в локальной сети

С++ Обмен данными в локальной сети

Ситуация: Реализую программу для управления компьютерами локальной сети на С++Вопрос: Как отправить структуру данных от клиента и принять...

109
Разница между inline и static переменной

Разница между inline и static переменной

В 17 стандарте есть новая фича: inline переменныеНо я не совсем понимаю, а в чем разница между inline и static переменной?

160