Мой базовый URL выглядит так.
http://localhost/test/s/beer-drinks
И в зависимости от ввода пользователя это может быть примерно так.
http://localhost/test/s/beer-New-York-drinks_alcoholic-No_rating-2-3_price-1-3_page-2
Часть, где написано «пиво», может быть любой строкой, которая является фактической строкой поиска, вводимой пользователем.
Часть, где написано «Нью-Йорк», может быть любым городом, и пользователь может установить или не устанавливать его.
Пользователь также может устанавливать или не устанавливать значения для следующих параметров. алкоголик может иметь значение «Нет» или «Да». Рейтинг может быть значением от 1 до 5, и несколько значений разделяются знаком - цена может быть значением от 1 до 5, а несколько значений разделяются знаком - страница - это число, указывающее смещение для разбивки на страницы
Я хотел направить URL-адрес выше и иметь возможность передавать значения для фактической строки поиска ("пиво"), игнорировать соответствие для города и передавать значения для алкоголя, рейтинга, цены и страницы, если они установлены.
У меня на htaccess что-то подобное
RewriteRule ^search$ s/ [R=301,L]
RewriteRule ^search/$ s/ [R=301,L]
RewriteRule ^s/(.*)-drinks_alcoholic-(.*)_rating-(.*)_price-(.*)_page-(.*) search/q_$1/alcoholic_$2/rating_$3/price_$4/page_$5/
.
.
.
RewriteRule ^s/(.*)-drinks_page-(.*) search/q_$1/page_$2/
RewriteRule ^s/(.*)-drinks search/q_$1/
Мне трудно сопоставить часть города, не нарушив порядок совпадений (1 доллар, 2 доллара и т. Д.).
я нашел Эта статья который объясняет условные выражения в шаблонах регулярных выражений, но я могу заставить его работать специально, если задана страница.
У меня нет под рукой apache, чтобы проверить то, что я говорю, но вы могли бы попробовать использовать группы без захвата для города. чтобы они не сломали твой $x
порядок
RewriteRule ^s/(.*)(?:-[A-Za-z-]+)?-drinks_alcoholic-(.*)_rating-(.*)_price-(.*)_page-(.*) search/q_$1/alcoholic_$2/rating_$3/price_$4/page_$5/
#( - start group
#?: - make it non-capturing, which means it will not effect $1,$2...
#- - if the group starts with -
#[A-Za-z-]+ - and looks like a words seperated by dashes (maybe you should enhance this a bit)
#)? - and the entire group may appear or not
Однако это может сбивать с толку, если ваш поисковый запрос (пиво) будет содержать более одного слова (красное вино). Я предлагаю использовать %20
или подчеркивание для пробелов в словах и тире для разделителей аргументов.