Я в своей cms сделал достаточно просто и работает как часы.
Все примерно так:
При инициализации страницы дергается метод parseBaseURL() в нем вычленяются из $_SERVER[«REQUEST_URI»] базовые переменные. А базовые для движка такие /ru/section/document.html
То-есть определяется текущий язык, если не указан то по умолчанию берется, потом раздел, и документ если он есть.
Далее. Вот пример: посетитель зашел по урлу /news/ — это у нас раздел сайта. В нем дергается модуль. Все что будет далее строиться например /news/page-1/, /news/view-1/, /news/download/file.zip или как угодно и что угодно может быть в урле. Как я это все распознаю. Базовый разбор был еще при инициализации, далее как я сказал дергается раздел, а к нему прицеплен модуль. В модуле я могу задать любой шаблон для урла.
Например:
$u_goods->addURL("#/cat-(\d+)/?#i", «category»);//add cat
$u_goods->addURL("#/goods-(\d+)/?#i", «goods»);//add goods
$u_goods->addURL("#/page-(\d+)/?$#i", «p»);//add pages var
И все. Уже в классе становятся доступные переменные category, goods, p. И так далее.
Итого — урл может быть какой угодно, и всегда в модуле для любого угла можно задать свое правило.