Здравствуйте Знатоки и прочие 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): RewriteEngine On Options +FollowSymlinks RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)$ view_cat.php?cat=$1&podcat=$2 [L] RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&page=$3 [L] RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([a-z0-9\-\=\_]+)/$ view_cat.php?cat=$1&podcat=$2&sort=$3 [L] RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([a-z0-9\-\=\_]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&sort=$3&page=$4 [L] RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/([0-9])$ view_cat.php?cat=$1&podcat=$2&page=$3 [L] 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] RewriteRule ^([a-z0-9\-]+)/([a-z0-9\-]+)/filter(.*)$ view_cat.php?cat=$1&podcat=$2&start_price=$4&end_price=$5&brand[]=$3 [L] 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): RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* index.php [L] Но это же нужно почти всю структуру сайта исправлять, а у меня к сожалению уже всё готово и заказчик кричит чтобы уже сдавал сайт. Нужна очень помощь. Спасибо!
Именно так и всю структуру исправлять не нужно. Пишется так называемый "роутер", который принимает все GET-запросы и, в зависимости от результата, подключает нужныйе шаблоны, скрипты и прочее. На мой личный взгляд и взгляд многих других разработчиков - это более гибгий способ и вызывает гораздо меньше проблем. Покажу вам абстрактный пример, а дальше решать вам: Код (PHP): /* Предположим, что сейчас обрабатываем URL, как в вашем вопросе Т.е. $_SERVER['REQUEST_URI'] будет содержать следующую строку: /amino/bcaa/filter?start_price=100&end_price=300&brand[]=1&brand[]=2&brand[]=3&brand[]=4 */ $uri_arr = parse_url(strtolower(urldecode($_SERVER['REQUEST_URI']))); // Что получаем в $uri_arr: Array ( [path] => /amino/bcaa/filter [query] => start_price=100&end_price=300&brand[]=1&brand[]=2&brand[]=3&brand[]=4 ) // Разбираем части пути $path_parts = explode('/', trim($uri_arr['path'], '/ ')); // Итог: Array ( [0] => amino [1] => bcaa [2] => filter ) // Разберём данные фильтров: parse_str($uri_arr['query'], $filter_params); // Теперь в $filter_params такой массив: Array ( [start_price] => 100 [end_price] => 300 [brand] => Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 ) ) Теперь у нас есть всё необходимое. Можно заранее создать массив, где ключами будут части пути URL, а значениями - имя подключаемого модуля, шаблона и т.д.
Deonis Огромное спасибо за то что растолковали что это за "направить всё на index.php")) Действительно я теперь понял) Ну вообщем копать нужно в сторону такого метода? А вот как эти запросы направить на нужный файл например view_cat.php?
Это уже зависит от вашей фантазии ) Как я написал выше, например, если у вас URL "site.ru/category/samsung/", то разбирая его, можно сравнивать с заранее подготовленным массивом: Код (PHP): // массив с подготовленными соответствиями $map = array( ''=>'main.php' /* главная*/ 'category' => 'view_cat.php', /* просмотр категории */ /* еще куча правил */ ); // разобрав URL, у нас будет массив $path_parts Array ( [0] => category [1] => samsung ) // Первый параметр - основной и служит для определения подключаемого файла, класса и т.д. include $map[$path_parts[0]]; // подключили нужный файл/шаблон // вторую часть "samsung", в подключенном файле используем в SQL-запросе, для выбора подкатегорий Это всё очень примитивно. В первую очередь, должно быть логически правильно построено само ЧПУ, дабы проще было понять и разобрать входящий URL. Ссылку на продукт, можно заканчивать расширением "html", первая часть пути URL - основная привязка к разделу сайта и т.д.