У меня есть сайт, зеркало другого сайта.
Мне нужно оформить страницу ошибки 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();
Фрагмент ниже говорит что любой запрос к несуществующему файлу будет отправлен на обработку в 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);
// опционально показываем что-то на странице
}
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
У меня есть сейчас список <select>, который функционирует для вывода таблиц с информациейНужен ещё , который будет списком ников
Ситуация: Реализую программу для управления компьютерами локальной сети на С++Вопрос: Как отправить структуру данных от клиента и принять...
В 17 стандарте есть новая фича: inline переменныеНо я не совсем понимаю, а в чем разница между inline и static переменной?