Роутер выдает ошибку 404

Как отобразить 404 и доработать роутер?

Делаю роутер с последующей иньекций роутов из бд, и вкурить никак не могу, как мне заставить работать страницу ошибки? Допустим 404. Надо, site.ru/абракадабра1111 выдало ошибку, по эррор документу в .htaccess и кинуло на /err (да я знаю что не перекинет на site.ru/err) но, почему не отрабатывает? Как раздебажить? Вар дампом все переменные прогнал, пытался встроить в foreach но при этом если страница существует в конфиге, всё равно отобразить код 404. .htaccess

 RewriteEngine on RewriteBase / RewriteCond % !-f RewriteCond % !-d RewriteRule ^(.*)$ index.php [QSA,L] RewriteCond % ^www.site.ru$ [NC] RewriteRule ^(.*)$ https://site.ru/$1 [R=301,L] RewriteCond % /(.*)index.php.*$ RewriteRule .* /%1 [R=301,L] RewriteEngine On RewriteCond % ^80$ RewriteRule ^.*$ https://%% [R=301,L] ErrorDocument 400 /err ErrorDocument 401 /err ErrorDocument 403 /err ErrorDocument 404 /err ErrorDocument 500 /err ErrorDocument 503 /err 
[default_routes] pMain='/'; admin='/admin'; login='/login'; logout='/logout'; error='/err'; 
display($routes); > public function getRequestPath() < $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); return '/' . ltrim(str_replace('index.php', '', $path), '/'); >public function display($routes) < $path = $this->getRequestPath(); $callf = new RouterPaths(); foreach ($routes as $i => $routers) < if ($path === $routers) < $callf->$i(); > > > > ?> 
 else < $error_page = 404; >> else if ($error_page == 'blocked') < $error_page = 'blocked'; >if ($error_page == 400) < header('HTTP/1.0 400 Bad Request'); header("HTTP/1.1 400 Bad Request"); header("Status: 400 Bad Request"); echo '400'; >else if ($error_page == 401) < header('HTTP/1.0 401 Unauthorized'); header("HTTP/1.1 401 Unauthorized"); header("Status: 401 Unauthorized"); echo '401'; >else if ($error_page == 403) < header('HTTP/1.0 403 Forbidden'); header("HTTP/1.1 403 Forbidden"); header("Status: 403 Forbidden"); echo '403'; >else if ($error_page == 404) < header('HTTP/1.0 404 Not Found'); header("HTTP/1.1 404 Not Found"); header("Status: 404 Not Found"); echo '404'; >else if ($error_page == 500) < header('HTTP/1.0 500 Internal Server Error'); header("HTTP/1.1 500 Internal Server Error"); header("Status: 500 Internal Server Error"); echo '500'; >else if ($error_page == 503) < header('HTTP/1.0 503 Service Temporarily Unavailable'); header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); echo '503'; >else if ($error_page == 'blocked') < header('HTTP/1.0 403 Forbidden'); header("HTTP/1.1 403 Forbidden"); header("Status: 403 Forbidden"); echo 'blocked'; >exit; > public function pMain() < echo 'Main'; >public function admin() < echo 'Admin'; >> ?> 

2 ответа 2

Попробуйте пересмотреть ваше решение. Возьмите чистый лист бумаги (или откройте пустой файл в текстовом редакторе) и напишите что вы хотите сделать. Постарайтесь мыслить независимо от уже имеющихся у вас решений. Например, последующая инъекция роутов из бд звучит круто, но на самом деле не имеет отношения к маршрутизации.

Давайте попробуем вместе. Во-первых нужна маршрутизация, то есть возможность в вашем приложении запустить разные обработчики запросов в зависимости от формата этих запросов. Например, для запроса GET /login хочется запустить обработчик, который соберёт html-форму, а для запроса GET /logout обработчик, который удалит сессию пользователя и перенаправит его на главную страницу.

Получается, что нужно соответствие запрос -> обработчик. Похоже на то, что записано у вас в default.ini , только в другую сторону. Это соответствие можно хранить в ini-файле, в базе данных, в памяти и вообще любом месте. Но попадать в объект маршрутизатора оно должно уже в подготовленном виде (парсинг ini-файла в конструкторе делает ваш код совершенно негибким). Я думаю для начала соответствие запрос -> обработчик может быть одномерным ассоциативным массивом, где в ключе будет образец запроса, а в значении имя обработчика.

Читайте также:  Роутер ноутбук нет сети

Так как мы говорим об образце запроса, о шаблоне, то на ум приходят регулярные выражения. Они очень удобны в случае, когда запрос содержит данные, которые надо из него извлечь. Например, GET /users/123 , где 123 — идентификатор пользователя. Регулярные выражения это строки и они могут быть ключами ассоциативного массива маршрутов.

[ '~^GET /login$~' => 'login', '~^GET /logout$~' => 'logout', '~^GET /users/(?\d*)$~' => 'user', ]; 

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

Теперь самое главное. Что должен делать роутер? Должен ли он добывать запрос из окружения? Должен ли отправлять ответ? Нет, не должен. Он должен только сопоставлять переданный ему запрос с образцами из массива и возвращать обработчик или null, если обработчик не удалось найти. Обратите внимание, что роутер даже не выполняет обработчик, он просто занимается маршрутизацией.

class Router < private $routes; public function __construct(array $routes) < $this->routes = $routes; > public function route(string $request): array < foreach ($this->routes as $pattern => $handler) < $matches = []; if (preg_match($pattern, $request, $matches) === 1) < $params = []; foreach ($matches as $name =>$value) < if (is_string($name)) < $params[$name] = $value; >> return [$handler, $params]; > > return [null, []]; > > 

Получился довольно простой класс. Его даже можно протестировать не заморачиваясь с созданием разных ini-файлов или замокиванием бд. Пользоваться им очень просто.

$method = $_SERVER['REQUEST_METHOD']?? 'UNKNOWN'; $url = $_SERVER['REQUEST_URI']?? ''; $path = parse_url($url, PHP_URL_PATH); list($handler, $params) = $router->route("$method $path"); 

Если $handler === null , значит обработчик не найден и можно вернуть 404 ошибку. Обычно это делается так:

http_response_code(404); echo 'Страница не найдена'; // тут можно вывести красивую страницу ошибки exit(0); 

После этого остаётся только выполнить обработчик и вывести результат. Тут есть простор для творчества, но мне нравится подход с подключением обработчиков из файлов (в таком случае возможна ситуация, когда маршрутизатор нашёл маршрут, но файла не существует, тогда можно тоже вернуть 404). Я покажу вам класс, который использую, надеюсь вы поймёте что к чему.

class Loader < private $dir; public function __construct(string $dir) < $this->dir = $dir; > public function load(string $path) < $fullPath = realpath($this->dir . '/' . $path); if (!$fullPath) < throw new \Exception('Не найден скрипт ' . $path); >$isSafe = (strpos($fullPath, $this->dir) === 0); if (!$isSafe) < throw new \Exception( 'Скрипт "' . $path . '" за пределами директории "' . $this->dir . '"' ); > if (!is_file($fullPath) || !is_readable($fullPath)) < throw new \Exception( 'Скрипт "' . $fullPath . '" не является файлом доступным для чтения' ); >$result = require $fullPath; return $result; > > 

Сами обработчики лежат в отдельной папке (например handlers ) и возвращают что-нибудь callable .

Источник

Ошибка 404. «Страница не найдена» (Not Found). Как исправить?

Продолжаем разбираться с ошибками, которые часто можно увить в окне своего браузера. И в этой статье мы выясним, что за «Ошибка 404 Not Found», или просто «Страница не найдена» и как ее исправить.

Начну наверное с того, что ошибка 404 может появляться практически в любом браузере и на любом устройстве. Будь то компьютер, ноутбук, телефон, планшет, или какое-то другое устройство. Так же без разницы, установлена у вас Windows 10, 8, 7, или вообще XP. Это проблема не с вашим устройством и не с подключением к интернету (в большинстве случаев) .

Читайте также:  Маршрутизатор xiaomi mi router ax3200

Саму ошибку «Not Found», или «Нет такой страницы» можно наблюдать при посещении самых разных сайтов. В социальных сетях, в поисковых системах, и даже на вашем любимом сайте, где вы фильмы смотрите 🙂

Так же сама ошибка может выглядеть по-разному. В данном случае все зависит от того, как она настроена на сайте. Не редко, это обычная, можно сказать стандартная ошибка, которую выдает сервер. Выглядит она примерно вот так:

Ошибка 404

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

Ошибка 404: что это и почему она появляется?

Данная ошибка означает, что вы пытаетесь перейти по адресу, которого не существует. Страница по этому адресу недоступна. Адрес страницы изменился, или она была удалена. Например, возьмем одну из страниц этого сайта. Пускай это будет https://help-wifi.com/poleznoe-i-interesnoe/chto-takoe-router-chem-wi-fi-router-otlichaetsya-ot-marshrutizatora. Если перейти по этому адресу, то загрузится необходимая нам страница. Но, если изменить адрес, например добавить в конце какую-то цифру, или букву, то мы увидим ошибку «Страница не найдена». Так как страницы с таким адресом просто не существует на сайте.

Ошибка в браузере на сайте:

Как видите, у меня страница с ошибкой более информативная, чем на скриншоте в начале статьи. Можно перейти на главную, найти что-то через поиск по сайту, или посмотреть другие статьи.

В социальной сети Вконтакте, например, страница с ошибкой 404 выглядит вот так (Page Not Found) :

Ошибка

Как мы уже выяснили, эта ошибка появляется из-за проблем на самом сайте. В большинстве случаев, просто меняется адрес нужной вам страницы, или администратор сайта удаляет ее. Могут быть проблемы на стороне сервера, где находится сайт. Например, неправильная работа какой-то системы защиты и т. д. С поисковой системы вряд ли можно зайти на страницу, с ошибкой Not Found. Так как поисковые системы «выбрасывают» такие страницы из индекса. Я сам не редко сталкиваюсь с этой ошибкой при переходе на какую-то страницу из закладок, или по ссылке на сайте.

Как исправить ошибку 404 «Страница не найдена»?

Решений очень мало. Так как проблема не на вашей стороне, а на стороне сервера (сайта). И скорее всего, вряд ли вы уже сможете получить доступ к этой странице. Но несколько решений, которые могут исправить эту ошибку, все таки есть.

  • Первым делом обновите страничку в браузере. Нажмите на клавишу F5, или на соответствующую кнопку в самом браузере.
    Обновление страницы при появлении ошибки 404
  • Проверьте адрес в адресной строке. Может вы туда случайно что-то дописали.
    Ошибка Not Found из-за неверного адресаНе редко ошибка 404 появляется из-за того, что автор на сайте неправильно указал адрес ссылки. У меня такое было несколько раз.
  • Скопируйте ссылку из адресной строки браузера, и попытайтесь найти ее через поисковую систему Яндекс, или Google.
    Поиск страницы при ошибке Возможно, в результатах поиска появится необходимый нам сайт и необходимая страница.
  • Вернитесь на главную страницу сайта, и попробуйте найти необходимую страницу через меню на сайте, или через поиск.
  • Попробуйте открыть данный URL (адрес) в другом браузере, или с другого устройства. Если в другом браузере все отлично откроется, вы не увидите ошибки «Страница не найдена», то очистите кэш своего браузера. Для примера: как это сделать в браузере Opera.
  • Если весь сайт недоступен (даже главная страница) и в браузере появляться ошибка Not Found (или другая с кодом 404) , а с другого устройства (через другое подключение к интернету) все открывается, то скорее всего ваш IP-адрес по какой-то причине заблокирован на сервере. Можно сменить IP с помощью VPN плагина для браузера. Если очень нужно зайти на этот сайт.
  • Редко, но может быть проблема с DNS. В таком случае, можно попробовать прописать DNS от Google.
  • Если вам очень нужно получить доступ к странице с информацией, на которой появляется ошибка «Нет такой страницы» (или что-то в этом роде) , то вы можете написать администрации сайта и объяснить проблему. Возможно, они подскажут вам новый адрес.
Читайте также:  Роутер блокирует подключение ноутбука

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

Подводя итоги: эта ошибка в большинстве случаев возникает из-за проблем на самом сайте. Нам нужно только смерится, и найти необходимую информацию на другом сайте. Это не большая проблема в наше время.

Источник

Роутер выдает ошибку 404

Роутер DIR-615 выдает 404 Not Found

Добрый день. Случилась такая проблема. Есть роутер DIR-615. Был Ip 192.168.0.1. Он в принципе таким же и остается. Решил зайти на него вчера, пошуршать. Логин и пароль помню как ща ибо сам же его и назначал, ошибиться не мог. Но стал выдавать неправильный пароль и все тут. Под юзером заходит без проблем. В логах никаких изменений нет. на роутер логинились только с одного IP, который лично у меня.
В какой-то момент 192.168.0.1 стал выдавать на странице 404 Not Found File not found. И все. Ни окон авторизации. Но при этом девайс пингуется. Интернет через него ходит. Все клиенты что висят на нем по вафле и проводу тоже работают. Ну в принципе логичный вопрос, что с этим роутером. Как с ним бороться? Сбрасывать жалко, очень большая таблица маршрутизации на нем настроена. Вспомнить все потом не смогу. А бекапом как-то не обзавелся.
Спасибо.

Уважаемые администраторы форума DLINK спасибо, что «помогли». Проблема решилась без вашей не оценимой помощи.

Все в точности, начиная со слов

. В какой-то момент 192.168.0.1 стал выдавать на странице 404 Not Found File not found. И все. Ни окон авторизации. Но при этом девайс пингуется. Интернет через него ходит. Все клиенты что висят на нем по вафле и проводу тоже работают. Ну в принципе логичный вопрос, что с этим роутером. Как с ним бороться? Сбрасывать жалко, очень большая таблица маршрутизации на нем настроена. Вспомнить все потом не смогу. А бекапом как-то не обзавелся.
Спасибо.

Кто сталкивался, может быть? 10 лет сообщению. С автором хотел связаться, но лички не дает сайт писать, видно мал еще.

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

Источник

Оцените статью
Adblock
detector