Slug url без всяких редиректов

Рейтинг: 1Ответов: 1Опубликовано: 22.04.2015

На stackoverflow, и на других сайтах используется, как я понимаю, штука под названием slug url, текстовое описание страницы после кода (эта страница: ru.stackoverflow.com/questions/418314/slug-url-без-всяких-редиректов ) Я хочу сделать также, но не используя перенаправлений на основную страницу, так сделано у blizzard (например http://eu.battle.net/wow/ru/blog/18539917/тут-можно-написать-что-угодно ). Как технически это сделать?

Ответы

▲ 1

Механизмы абсолютно идентичны, если не считать финальную проверку с перенаправлением.

По 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 только одна).

Таким образом, минимальная реализация этого шаблона подразумевает:

  1. Создание таблицы соответствий регулярка-контроллер
  2. Создание роутера, который будет по этой таблице проходиться
  3. Создание приложения, которое все это запускает
  4. И, наконец, создание самого контроллера, который будет обрабатывать запрос и искатьпо id запись.

Первые три пункта реализованы во всех фреймворках, которые вы найдете, прямо "из коробки". Продвинутые фреймворки умеют куда большее, чем просто сопоставлять url с регуляркой, и, соответственно, позволяют более гибкую настройку (примеры: symfony - вплоть до специальных проверок на соответствие заголовков, laravel - разбиение по HTTP-методам из коробки).