Механизмы абсолютно идентичны, если не считать финальную проверку с перенаправлением.
По URL определяем конкретный кусок кода, который ответственен за рендеринг (обычно все строится по шаблону MVC, и определяется непосредственно контроллер). Чаще всего совпадения ищутся на основе регулярок, для этого в конфигурации задается таблица соответствий "регулярка-контроллер":
^wow/(?P<language>\w+)/blog/?$
-> blog/index
^wow/(?P<language>\w+)/blog/(?P<id>\d+)/(?P<slug>[^/]+)/?$
-> blog/post
.*
-> pages/show // catch-all, который возьмет на себя все URL, не подпадающие под предыдущие правила.
После этого роутер последовательно сравнивает текущий REQUEST_URI
c каждой регуляркой и, в случае нахождения совпадения, отдает приложению идентификатор ответственного контроллера заодно с совпадениями из url (в данном случае это language
, id
и slug
). Приложение запускает этот контроллер, передавая ему параметры. В данном случае контроллер будет использовать id
, чтобы найти необходимую запись по этому самому id
. И вот только на этом этапе начинаются различия: battle.net сразу выведет запись, не обращая внимания на slug
, stackoverflow же проверит slug
на совпадение с тем, который он считает правильными, и если ему что-то непонравится, то он перенаправит на нужную страницу. Делается это, очевидно, для поисковой оптимизации (для поисковика на battle.net может быть условно-бесконечное количество страниц с одним и тем же контентом, у stackoverflow только одна).
Таким образом, минимальная реализация этого шаблона подразумевает:
- Создание таблицы соответствий регулярка-контроллер
- Создание роутера, который будет по этой таблице проходиться
- Создание приложения, которое все это запускает
- И, наконец, создание самого контроллера, который будет обрабатывать запрос и искатьпо
id
запись.
Первые три пункта реализованы во всех фреймворках, которые вы найдете, прямо "из коробки". Продвинутые фреймворки умеют куда большее, чем просто сопоставлять url с регуляркой, и, соответственно, позволяют более гибкую настройку (примеры: symfony - вплоть до специальных проверок на соответствие заголовков, laravel - разбиение по HTTP-методам из коробки).