Роутинг на PHP?
Всем привет! Столкнулся с проблемой: постоянно выдается ошибка 404
Вот код:
Routing.php
<?php class Router { private $pages = array(); function addRoute($url, $path){ $this->pages[$url] = $path; } function route($url){ if(isset($this->pages["/".$url])) { //выяснил что ошибка возникает на этой проверки $path = $this->pages["/".$url]; $file_dir = "app/".$path; if ($path == "") { require "errors/404.html"; die(); } if (file_exists($file_dir)) { require $file_dir; } else { require "errors/404.html"; die(); } } else { require "errors/404.html"; die(); } } } ?> |
<?php class Router { private $pages = array(); function addRoute($url, $path){ $this->pages[$url] = $path; } function route($url){ if(isset($this->pages["/".$url])) { //выяснил что ошибка возникает на этой проверки $path = $this->pages["/".$url]; $file_dir = "app/".$path; if ($path == "") { require "errors/404.html"; die(); } if (file_exists($file_dir)) { require $file_dir; } else { require "errors/404.html"; die(); } } else { require "errors/404.html"; die(); } } } ?>
index.php
<?php require "system/Routing.php"; $url = isset($_GET['url']) ? $_GET['url'] : ''; $router = new Router(); $router->addRoute("/cameras", "apps/cameras/index.php"); $router->route($url); ?> |
<?php require "system/Routing.php"; $url = isset($_GET['url']) ? $_GET['url'] : ''; $router = new Router(); $router->addRoute("/cameras", "apps/cameras/index.php"); $router->route($url); ?>
.htaccess
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L] </IfModule> |
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [QSA,L] </IfModule>
В чем может быть проблема? Заранее спасибо!
P.S.
файл apps/cameras/index.php доступен при запросе в формате :80/apps/cameras/index.php
Дополнительно:
marakhd а почему решили не использовать что-то из готовых решений для роутинга?
из самого примитивного и простого https://github.com/nikic/FastRoute
ну например чтобы дальше не пошли вопросы а как сделать роуты с подстановкой параметров по типу GET: /cameras/camera/<id> ?
или вопросы в духе как мне сделать разные обработчики при одинаковом имени роута например GET: /route и POST: /route ?
а как сделать группированные роуты?
а как лучше прикрутить кеширование для роутов так как у меня их набралось под сотню?
а если я хочу на роуты навесить middleware?
Если нужен просто роутинг на 2-3 маршрута то это делается ещё проще
<?php $url = $_GET['url'] ?? ''; $handler_file = match($url) { "/" => "apps/index.php", "/cameras" => "apps/cameras/index.php", default => "errors/404.html", }; if(is_file($handler_file)) { require($handler_file); exit; } |
<?php $url = $_GET['url'] ?? ''; $handler_file = match($url) { "/" => "apps/index.php", "/cameras" => "apps/cameras/index.php", default => "errors/404.html", }; if(is_file($handler_file)) { require($handler_file); exit; }
Ответы:
class Router { private $pages = array(); function addRoute($url, $path){ - $this->pages[$url] = $path; + $this->pages[trim('/', $url)] = $path; } function route($url){ + url = trim('/', $url); - if(isset($this->pages["/".$url])) { + if(isset($this->pages[$url])) { - $path = $this->pages["/".$url]; + $path = $this->pages[$url]; $file_dir = "app/".$path; if ($path == "") { require "errors/404.html"; die(); } if (file_exists($file_dir)) { require $file_dir; } else { require "errors/404.html"; die(); } } else { require "errors/404.html"; die(); } } } require "system/Routing.php"; -$url = isset($_GET['url']) ? $_GET['url'] : ''; +[$url] = explode('?', $_SERVER['REQUEST_URI']); $router = new Router(); $router->addRoute("/cameras", "apps/cameras/index.php"); $router->route($url); |
class Router { private $pages = array(); function addRoute($url, $path){ - $this->pages[$url] = $path; + $this->pages[trim('/', $url)] = $path; } function route($url){ + url = trim('/', $url); - if(isset($this->pages["/".$url])) { + if(isset($this->pages[$url])) { - $path = $this->pages["/".$url]; + $path = $this->pages[$url]; $file_dir = "app/".$path; if ($path == "") { require "errors/404.html"; die(); } if (file_exists($file_dir)) { require $file_dir; } else { require "errors/404.html"; die(); } } else { require "errors/404.html"; die(); } } } require "system/Routing.php"; -$url = isset($_GET['url']) ? $_GET['url'] : ''; +[$url] = explode('?', $_SERVER['REQUEST_URI']); $router = new Router(); $router->addRoute("/cameras", "apps/cameras/index.php"); $router->route($url);
- Спасибо! Но теперь проблема возникает на
if (file_exists($file_dir))
хотя sitenp.loc/apps/cameras/index.php - marakhd,
Лучше использовать абсолютный путь.
if (file_exists(__DIR__.$file_dir)) {C путями разберитесь
$router->addRoute("/cameras", "apps/cameras/index.php"); $file_dir = "app/".$path; // "app/apps/cameras/index.php"
$router->addRoute("/cameras", "apps/cameras/index.php"); $file_dir = "app/".$path; // "app/apps/cameras/index.php"
- Сергей delphinpro, спасибо
- trim() поменял бы на ltrim() так как иначе роуты со слешем на конце не будут работать
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для реализации роутинга на PHP можно использовать различные подходы, одним из наиболее популярных является использование фреймворков или создание собственного маршрутизатора.
Если вы используете фреймворк, то, вероятно, он уже предоставляет встроенные инструменты для настройки роутинга. Например, в Laravel вы можете определить маршруты в файле routes/web.php, где вы можете указать URL-адреса и связанные с ними действия контроллера.
Если же вы предпочитаете создать свой собственный маршрутизатор, то вам необходимо определить логику обработки URL-адресов и вызов соответствующих действий. Ниже приведен пример простого маршрутизатора на PHP:
'homePage', '/about' => 'aboutPage', '/contact' => 'contactPage', ]; // Получаем запрошенный URL $requestUrl = $_SERVER['REQUEST_URI']; // Проверяем, существует ли запрошенный маршрут if (array_key_exists($requestUrl, $routes)) { // Вызываем соответствующее действие $action = $routes[$requestUrl]; call_user_func($action); } else { // Выводим страницу с ошибкой 404 header('HTTP/1.0 404 Not Found'); echo 'Error 404 - Page not found'; } // Функции для обработки маршрутов function homePage() { echo 'Welcome to the home page!'; } function aboutPage() { echo 'About us page'; } function contactPage() { echo 'Contact us page'; } ?>
В данном примере мы определяем массив $routes, в котором указываем соответствие маршрутов и функций-обработчиков. Затем мы получаем запрошенный URL, проверяем его наличие в массиве маршрутов и вызываем соответствующую функцию. Если запрошенного маршрута не существует, мы выводим страницу с ошибкой 404.
Это всего лишь один из возможных способов реализации роутинга на PHP. В зависимости от ваших потребностей и уровня сложности проекта, вы можете использовать более продвинутые методы и инструменты для управления маршрутами.