Xpoint
   [напомнить пароль]

Организация ЧПУ в cms

Метки: [без меток]
2008-11-21 19:05:17 [обр] Антон[досье]

Нужен совет опытных программистов по организации работы с ЧПУ в cms. Так как ЧПУ нужен для всех плагинов, многие которые только в задумке и неизвестно когда будут реализованы, а при установке править htaccess добавляя пару новых правил для mod_rewrite крайне неудобно, решил сделать так.. (в голову ничего лучше не пришло по крайней мере).

Все шаблоны хранятся в БД. Средствами mod_rewrite скрипту через GET передается url, который запросил пользователь.
Далее он прогоняется на совпадение с шаблонами (preg_match), и, в случае, если шаблон подошел, вызывается модуль, который указан в БД для данного шаблона.

Они уникальны по первой "директории", поэтому совпадений случайных быть не может.

Но вызвать модуль мало, нужно в него как-то еще передать данные.. Поэтому решил добавить дополнительно поле replacement.. Которое собственно используется для постройки строки (preg_replace), которая впоследующем будет разбиваться на массив и "скармливаться" модулю.

Чтобы не быть голословным, приведу пример:

url: news/description/123.html
pattern: news\/description\/(\d+)\.html
replacement: action=description|id=\\1

Собственно для чего я это все тут пишу.. Не скажу, что мне нравится это решение, поэтому прошу гуру черкнуть пару строк о том, как они относятся к такому подходу.. И, если есть идеи, предложить действия по оптимизации, или другие варианты.

ЗЫ Чуть не забыл, мне этот вариант нравится тем, что можно легко прописать "алиас" для страницы..

спустя 1 день 23 часа [обр] triumvurat[досье]

Не понял, для чего нужна replacement строка.

В идеале ИМХО нужно из URL получать нужный контроллер, действие и отдавать остальные параметры в этот контроллер.

спустя 3 дня [обр] Антон[досье]

Вариант, который предложили вы, я рассматривал в первую очередь. Но хотелось бы, чтобы параметры имели имена.. Согласитесь, так удобнее.

>Не понял, для чего нужна replacement строка.
Нужна она была для того, чтобы дать параметрам имена. Т.е. сформировав строку вида "action=description|id=\\1" (не обязательно в таком виде) планировалось ее разбивать на массив.

От этого варианта практически сразу же отказался. Не смотря на то, что мне он кажется удобным.. Лишняя нагрузка.

спустя 59 минут [обр] triumvurat[досье]

Антон[досье]

Но хотелось бы, чтобы параметры имели имена..

Какие параметры? Все параметры у вас будут в соответствующих массивах, когда при обработке URL адреса найдете сопоставление этого URL с одним из шаблонов URL:

$_CONFIG['aliases'] = array
(
    // шаблон URL => модуль сайта 
    '~/articles/?$~' => 'articles_index',
    '~/articles/([a-zA-Z0-9_\-]+)/?$~' => 'articles_rubrics',
    '~/articles/([a-zA-Z0-9_\-]+)/([a-zA-Z0-9_\-]+)\.html~' => 'article',
);

foreach ($_CONFIG['aliases'] as $regexp => $mod)
{
    if (preg_match($regexp, $_REQUEST["path"], $_PARAMS))
    {
        // тут в PARAMS у вас все необходимые данные. 
        // какие из них использовать модулем - знает сам модуль
    }
}

Далее. ЧПУ - это не строка вида /guestbook/ru/mess/23/edit/ok, которую многие хотят реализовать в своих приложениях. Например, идеальный ЧПУ для какой-либо страницы раздела статьи должен выглядеть так: /articles/sex/sex_in_the_sity.html и больше никак. Все остальные GET-параметры, которые могут быть, а могут и не быть (типа номера страницы комментариев, способ сортировки и т.д.) мы получаем через Query String: /articles/sex/sex_in_the_sity.html?page=2. И только через Query String. Ибо ЧПУ вида /articles/sex/sex_in_the_sity/page/2/order/id/ASC никому нафиг не нужен.

Кроме того, страницы
/articles/sex/sex_in_the_sity/page/2/
и
/articles/sex/sex_in_the_sity/page/3/
для Яндекса - не одно и тоже. А это уже плохо.

спустя 5 дней [обр] Филипп Ткачев(20/112)[досье]

>для Яндекса - не одно и тоже. А это уже плохо.
И чем же? Многие дизайнеры сильно переживают о склеенности страниц и прочих неудобствах. А когда нужный кусок статьи нормально индексируется и ищется это удобно, иначе зачем тогда вообще страницы? Опять же многие поисковики хорошо индексируют принт-версии документов.

Поимев небольшой опыт в разработке маленькой системы управления пришел к выводу, что использование ЧПУ, кроме лишних проблем, больше ничего не доставляет. Нормальные поисковики индексируют сайт даже если на нем хитрые URL в виде запросов.

Обработка одной страницы одним модулем? Что может быть смешнее? (Плавали, знаем)
На более или менее серьезном сайте страница формируется из результатов работы нескольких модулей.
Иногда встречается, что разные страницы и выглядят по-разному, например ваша статья про секс в городе разбита на несколько страничек для чтения и одну для печати. А смысл разбивать ее еще и для печати?

Наигравшись с ЧПУ пришел к выводу, что разбивать удобнее всего в отдельный массив и далее работать с каждым элементом массива.
Начиная с корня путем последовательного прохода назначаются ссответствующие модули и меняется их работа. При необходимости, в БД хранятся доп. модули, привязываемые к к конкретной странице или группе страниц. Туда же можно положить и чудесные регулярные выражения.

спустя 2 дня 6 часов [обр] triumvurat[досье]
Филипп Ткачев[досье] Я хотел сказать, что PR для страницы
/price.html?page=1 и для страницы /price.html?page=2 будет один об, а для страниц /price/page1/ и /price/page2/ - разный.
спустя 3 месяца 7 дней [обр] Javof[досье]
Подскажите паттерн.
Делаю
RewriteRule ^(.*)(/?(.*))+$ /?$3&uri=$1 [QSA]
=500
Похоже что паттерн циклический, но с флагом L
RewriteRule ^(.*)(/?(.*))+$ /?$3&uri=$1 [QSA,L]
Серавно 500
спустя 1 день 22 часа [обр] Алексей В. Иванов(509/2861)[досье]
Javof[досье] Для своего вопроса создайте новую тему, тут обсуждается другая.
Но в любом случае, сначала убедитесь, что у вас включен модуль mod_rewrite в апаче.
Powered by POEM™ Engine Copyright © 2002-2005