.htacces: Options -MultiViews RewriteEngine on RewriteBase /public RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ index.php?url=$1 [QSA,L] public/index.php: parseUrl(); if (file_exists('../app/controllers/' . "$url[0].php")) { $this->controller = $url[0]; unset($url[0]); } require_once '../app/controllers/' . "{$this->controller}.php"; $this->controller = new $this->controller; if(isset($url[1]) && method_exists($this->controller, $url[1])) { $this->method = $url[1]; unset($url[1]); } $this->params = $url ?? []; call_user_func_array([$this->controller, $this->method], $this->params); } function parseUrl() { if (isset($_GET['url'])) { return $url = explode('/', filter_var(rtrim($_GET['url'], '/'), FILTER_SANITIZE_URL)); } } }