Современный и как мне кажется правильный вариант - использовать роутинг и единую точку входа в приложение.
Это когда в публичной части лежит один единственный /index.php который запускает приложение и разруливает все запросы и позволяет вам реализовать любое ЧПУ.
На nginx такое делается как правило через дериктиву
try_files
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Это позволяет любой не существующий путь завернуть на /index.php где оригинальный запрос будет доступен в
$_SERVER['REQUEST_URI']
Существущие роутеры по сути просто предоставляют удобную возможность распарсить эти данные и передать данные дальнейшему обработчику (handler/controller/action)
https://github.com/ziadoz/awesome-php#routers