htaccess 重写规则以匹配动态参数

htaccess 重写规则以匹配动态参数

我的基本网址如下所示。

http://localhost/test/s/beer-drinks

并且根据用户的输入,它可以是这样的。

http://localhost/test/s/beer-New-York-drinks_alcoholic-No_rating-2-3_price-1-3_page-2   

“啤酒”部分可以是任何字符串,即用户输入的实际搜索字符串。

“纽约”部分可以是任何城市,用户可以选择设置或不设置。

用户还可以选择设置或不设置以下内容的值。alcoholic 的值为 No 或 Yes;rating 可以是 1 到 5 之间的值,多个值之间用 - 分隔;price 可以是 1 到 5 之间的值,多个值之间用 - 分隔;page 是一个数字,表示分页的偏移量

我想直接上面的 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 等)。

我发现本文它解释了正则表达式模式中的条件,但我似乎可以让它工作,特别是如果设置了页面。

答案1

我手边没有 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或下划线作为单词中的空格,使用破折号作为参数分隔符。

相关内容