Назад | Перейти на главную страницу

правила перезаписи htaccess для соответствия динамическим параметрам

Мой базовый 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 или подчеркивание для пробелов в словах и тире для разделителей аргументов.