ЧПУ с кириллицей

Тема в разделе "Mod Rewrite / htaccess / ЧПУ", создана пользователем Waki, 21 авг 2013.

  1. Waki

    Waki Постоялец

    Регистр.:
    14 ноя 2012
    Сообщения:
    64
    Симпатии:
    21
    На сайте имеется поиск где присутствует кириллица, пример урл:
    Код:
    http://site.com/search.php?city=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0&category=1&marka=%D0%92%D0%B0%D0%B7&model=2112
    category = 1 (категория легковых)
    city = Москва
    marka = Ваз
    Как тут сделать ссылку вида:
    Код:
    http://site.com/cars/moscow/vaz/2112.html
    Предполагалось сделать через htaccess, но там слишком много строк получится. (где-то мельком видел что можно реализовать через файл httpd.conf, но так раньше не делал)

    Как поступить в данном случае?
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.175
    Симпатии:
    2.195
    htaccess - это быстрый способ правки httpd.conf. Т.е. если Вам надо прописать много правил в htaccess - это означает, что в httpd.conf их нужно будет вписать как минимум не меньше.
     
    Waki нравится это.
  3. Waki

    Waki Постоялец

    Регистр.:
    14 ноя 2012
    Сообщения:
    64
    Симпатии:
    21
    А как туда прописывать? Сейчас на сервере установлен только apache, нужен ли будет для этих целей nginx ?
    Есть ли другое решение, кроме перечисления всех возможных вариантов урл-ов с кириллицей? (кроме правки скриптов)
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.175
    Симпатии:
    2.195
    Выполнить это иначе - нельзя. Нужно либо прописывать все правила, либо объяснять скрипту, что Moscow - это Москва, а LADA - это ВАЗ...

    Вообще, по хорошему, есть смысл искать не по слову, а по ID категории. Увы, я не знаю Вашей CMS, судить о возможности этого не могу, но просто расскажу как это делается.
    У меня есть блог. Категория называется "Новости" и имеет id = 1. В ЧПУ она показывается как news, что прописано в соответственном поле БД.

    При формировании запроса, ссылка получается такой: ~/blog/1-news/123-mega-news.html

    Как это работает. ЧПУ передаёт скрипту только ID категории и ID новости. Дальше уже сам скрипт проверяет верность URL и делает 301 редирект по необходимости. Это и безопасно, и выглядит не так уж плохо. Почему не по имени? Если я укажу ~/blog/1-qwerty/123-mega-news.html - новость всё равно откроется, но произойдёт редирект на ~/blog/1-news/123-mega-news.html А вот если я поменяю ID, то откроется уже совершенно другая новость из базы.

    Можно делать и по названию, но тогда надо ставить фильтры, а так достаточно Intval и ЧПУ безопасно.
     
    Waki и esche нравится это.
  5. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Видел много самописных CMS, где этот момент не учитывали - не было проверки на правильный URL. т.е. тупо 1-news 1-news1 1-news2 - всё были дублями.


    Задача-то какая стоит?
    Поиск часто закрывают от индексации по той же причине - появление дублей.

    Можно написать свой роутер, который будет преобразовывать введённый URL.. Если на пальцах, самый простой и универсальный вариант.. так примерно:


    Код:
    <?php
    $routes = array(
    '/cars/moscow/vaz/2112.html'=>array('category'=>1,'city'=>'Москва','marka'=>'Ваз','model'=>'2112','file'=>'search.php'),
    );
     
    if (isset($routes[$_SERVER['REQUEST_URI']])) {
    $data = $routes[$_SERVER['REQUEST_URI']];
    $file = $data['file']; unset ($data['file']);
    $_GET = array_merge($_GET,$data);
    include $file;
    exit();
    }
    // тут 404 ошибка
    
    При помощи .htaccess все неразобранные URL-ы направляются на этот роутер (или include-тся в первых строчках index.php, если уже есть перенаправление работающее)

    Массив вместо жёсткого указания соответствий можно формировать автоматически по правилам из URL (при помощи регулярки, например).
    * если в CMS предусмотрены штатные средства маршрутизации, лучше использовать их.
     
    Waki нравится это.