За последние 24 часа нас посетили 20194 программиста и 1717 роботов. Сейчас ищут 1834 программиста ...

Уважаемые знатоки. Помогите разрешить проблему с ЧПУ

Тема в разделе "PHP для новичков", создана пользователем gERYH, 15 авг 2014.

  1. gERYH

    gERYH Новичок

    С нами с:
    24 июл 2014
    Сообщения:
    18
    Симпатии:
    1
    Здравствуйте Знатоки и прочие Seniors Developers. Помогите новичку в разрешении проблемы с ЧПУ. В общем ситуация такая:
    Есть интернет-магазин с фильтром товаров. Фильтр в форме с методом GET.
    Ссылка до включения фильтра товаров sporteda.com.ua/amino/bcaa
    Ссылка после включения фильтра товаров sporteda.com.ua/amino/bcaa/filter?start_price=100&end_price=300&brand[]=1&brand[]=2&brand[]=3&brand[]=4
    Всё было бы хорошо если бы htaccess не экранировал всё что идёт после "filter?".
    Я пытался учить регулярные выражения всё хорошо идёт но всё равно ничего не выходит.

    Вот код htaccess

    Код (Text):
    1. RewriteEngine On
    2. Options +FollowSymlinks
    3. RewriteCond   %{REQUEST_FILENAME} !-d
    4. RewriteCond   %{REQUEST_FILENAME} !-f
    5.  
    6. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)$ view_cat.php?cat=$1&podcat=$2 [L]
    7. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&page=$3 [L]
    8. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([a-z0-9\-\=\_]+)/$ view_cat.php?cat=$1&podcat=$2&sort=$3 [L]
    9. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([a-z0-9\-\=\_]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&sort=$3&page=$4 [L]
    10. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&page=$3 [L]
    11. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/filter=([a-z0-9\-\=\_]+)&([a-z0-9\-\=\_]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&start_price=$3&end_price=$4&page=$5 [L]
    12. RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/filter(.*)$ view_cat.php?cat=$1&podcat=$2&start_price=$4&end_price=$5&brand[]=$3 [L]
    13. RewriteRule ^([a-z0-9\-]+)/filter=(.*)&(.*)/(.*)/([0-9])$ view_cat.php?cat=$1&podcat=$2&start_price=$3&end_price=$4&page=$5 [L]


    Я понимаю что я полный нуб в htaccess но всё же чтобы вы порекоммендовали, убирать этот код из htaccess и вставлять что-то другое. Я читал на просторах интернета что можно сделать так чтобы все запросы направлялись в index.php т.е
    Код (Text):
    1.  
    2. RewriteEngine on
    3.  
    4. RewriteCond %{REQUEST_FILENAME} !-f
    5. RewriteCond %{REQUEST_FILENAME} !-d
    6.  
    7. RewriteRule .* index.php [L]

    Но это же нужно почти всю структуру сайта исправлять, а у меня к сожалению уже всё готово и заказчик кричит чтобы уже сдавал сайт. Нужна очень помощь. Спасибо!
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Именно так и всю структуру исправлять не нужно. Пишется так называемый "роутер", который принимает все GET-запросы и, в зависимости от результата, подключает нужныйе шаблоны, скрипты и прочее. На мой личный взгляд и взгляд многих других разработчиков - это более гибгий способ и вызывает гораздо меньше проблем. Покажу вам абстрактный пример, а дальше решать вам:

    Код (PHP):
    1. /* Предположим, что сейчас обрабатываем URL, как в вашем вопросе
    2. Т.е. $_SERVER['REQUEST_URI'] будет содержать следующую строку: 
    3. /amino/bcaa/filter?start_price=100&end_price=300&brand[]=1&brand[]=2&brand[]=3&brand[]=4 */
    4. $uri_arr = parse_url(strtolower(urldecode($_SERVER['REQUEST_URI'])));
    5. // Что получаем в $uri_arr:
    6. (
    7.     [path] => /amino/bcaa/filter
    8.     [query] => start_price=100&end_price=300&brand[]=1&brand[]=2&brand[]=3&brand[]=4
    9. )
    10. // Разбираем части пути
    11. $path_parts = explode('/', trim($uri_arr['path'], '/ '));
    12. // Итог:
    13. (
    14.     [0] => amino
    15.     [1] => bcaa
    16.     [2] => filter
    17. )
    18. // Разберём данные фильтров:
    19. parse_str($uri_arr['query'], $filter_params);
    20. // Теперь в $filter_params такой массив:
    21. (
    22.     [start_price] => 100
    23.     [end_price] => 300
    24.     [brand] => Array
    25.         (
    26.             [0] => 1
    27.             [1] => 2
    28.             [2] => 3
    29.             [3] => 4
    30.         )
    31. )
    Теперь у нас есть всё необходимое. Можно заранее создать массив, где ключами будут части пути URL, а значениями - имя подключаемого модуля, шаблона и т.д.
     
  3. gERYH

    gERYH Новичок

    С нами с:
    24 июл 2014
    Сообщения:
    18
    Симпатии:
    1
    Deonis Огромное спасибо за то что растолковали что это за "направить всё на index.php")) Действительно я теперь понял) Ну вообщем копать нужно в сторону такого метода? А вот как эти запросы направить на нужный файл например view_cat.php?
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Это уже зависит от вашей фантазии ) Как я написал выше, например, если у вас URL "site.ru/category/samsung/", то разбирая его, можно сравнивать с заранее подготовленным массивом:
    Код (PHP):
    1. // массив с подготовленными соответствиями
    2. $map = array(
    3.     ''=>'main.php' /* главная*/
    4.     'category' => 'view_cat.php', /* просмотр категории */
    5.     /* еще куча правил */
    6. );
    7. // разобрав URL, у нас будет массив $path_parts
    8. (
    9.     [0] => category
    10.     [1] => samsung
    11. )
    12. // Первый параметр - основной и служит для определения подключаемого файла, класса и т.д.
    13. include $map[$path_parts[0]]; // подключили нужный файл/шаблон
    14. // вторую часть "samsung", в подключенном файле используем в SQL-запросе, для выбора подкатегорий  
    Это всё очень примитивно. В первую очередь, должно быть логически правильно построено само ЧПУ, дабы проще было понять и разобрать входящий URL. Ссылку на продукт, можно заканчивать расширением "html", первая часть пути URL - основная привязка к разделу сайта и т.д.
     
  5. gERYH

    gERYH Новичок

    С нами с:
    24 июл 2014
    Сообщения:
    18
    Симпатии:
    1
    В общем спасибо огромнейшее за достоверный ответ, буду сидеть, думать, продумывать)))
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    gERYH, ты злоупотребляешь цитированием. совсем необязательно так делать. это уже подбешивает.