Apache .htaccess (redirect all requests to not existing files/directories to index.php):
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ index.php [QSA,L]
PHP router file. Check if route is on list of available routes and include file by name of route. Some parts of route can be variables: ‘user/$name’. Variables can have default values: ‘users/$order=id’, default value can be empty string: ‘user/$name=’
<?php var_dump((string)$_SERVER['REDIRECT_URL']); $urlParts = explode('/', trim((string)$_SERVER['REDIRECT_URL'], '/')); $routes = [ 'login', 'logout', 'user/$name', 'users/list/$type=level/$page=2/$vocation=all', ]; function openRoute($pathParts, $vars) { $file = 'pages/' . implode('_', $pathParts) . '.php'; ob_start(); extract($vars); $main_content = ''; include($file); $main_content .= ob_get_clean(); return $main_content; } $routeFound = false; foreach ($routes as $route) { $routeParts = explode('/', $route); $vars = []; $pathParts = []; if (count($routeParts) >= count($urlParts)) { foreach ($routeParts as $partId => $routePart) { if ($routePart[0] === '$') { $optionalVar = strpos($routePart, '=') !== false; if ($optionalVar) { list($varName, $defaultValue) = explode('=', $routePart); $varName = substr($varName, 1); } else { $varName = substr($routePart, 1); } if (isset($urlParts[$partId])) { $vars[$varName] = $urlParts[$partId]; } elseif ($optionalVar) { $vars[$varName] = $defaultValue; } else { continue 2; } } elseif (isset($urlParts[$partId]) && $routePart === $urlParts[$partId]) { $pathParts[] = $routePart; } else { continue 2; } } var_dump('found: ', $route, $vars, $pathParts); $main_content = openRoute($pathParts, $vars); $routeFound = true; break; } } if (!$routeFound) { http_response_code(404); echo '404 Not found'; exit; }