我的基本网址如下所示。
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
或下划线作为单词中的空格,使用破折号作为参数分隔符。