Довольно URL-адреса в фреймворках PHP

Я знаю, что вы можете добавлять правила в htaccess, но я вижу, что фреймворки PHP этого не делают, и у вас все еще есть красивые URL-адреса. Как они это делают, если сервер не знает правил URL?

Я искал класс менеджера URL- адресов Yii, но я не понимаю, как он это делает.

Обычно это делается путем маршрутизации всех запросов в одну точку входа (файл, который выполняет другой код на основе запроса) с таким правилом, как:

# Redirect everything that doesn't match a directory or file to index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* index.php [L] 

Затем этот файл сравнивает запрос ( $_SERVER["REQUEST_URI"] ) со списком маршрутов – сопоставление шаблона, соответствующего запросу, для действия контроллера (в приложениях MVC) или другого пути выполнения. Рамки часто включают в себя маршрут, который может вывести контроллер и действие из самого запроса, в качестве маршрута резервного копирования.

Небольшой, упрощенный пример:

 <?php // Define a couple of simple actions class Home { public function GET() { return 'Homepage'; } } class About { public function GET() { return 'About page'; } } // Mapping of request pattern (URL) to action classes (above) $routes = array( '/' => 'Home', '/about' => 'About' ); // Match the request to a route (find the first matching URL in routes) $request = '/' . trim($_SERVER['REQUEST_URI'], '/'); $route = null; foreach ($routes as $pattern => $class) { if ($pattern == $request) { $route = $class; break; } } // If no route matched, or class for route not found (404) if (is_null($route) || !class_exists($route)) { header('HTTP/1.1 404 Not Found'); echo 'Page not found'; exit(1); } // If method not found in action class, send a 405 (eg Home::POST()) if (!method_exists($route, $_SERVER["REQUEST_METHOD"])) { header('HTTP/1.1 405 Method not allowed'); echo 'Method not allowed'; exit(1); } // Otherwise, return the result of the action $action = new $route; $result = call_user_func(array($action, $_SERVER["REQUEST_METHOD"])); echo $result; 

В сочетании с первой конфигурацией это простой скрипт, который позволит вам использовать URL-адреса, такие как domain.com/about . Надеюсь, это поможет вам понять, что здесь происходит.