我正在尝试为产品创建过滤系统并保持URL友好,我使用过滤器参数的映射文件和以下重写代码。
网址可以包含,一个参数或10个参数,并且将是这样的bulit
Start URL: www.domain.com/climbing-frames/
First Param: www.domain.com/climbing-frames_rockwall/
Second Param: www.domain.com/climbing frames_rockwall_rope-ladder/
等等......
到目前为止的重写规则
RewriteMap features txt:features.txt
RewriteCond ${features:$1|NOT_FOUND} !NOT_FOUND
RewriteRule ^climbing-frames(?:_([^/]+))(?:_([^/]+))(?:_([^/]+))(?:_([^/]+))/ /get-features.cfm?(?1(param1=${features:$1|0}))(?2(,${features:$2|0}))(?3(,${features:$3|0}))(?4(,${features:$4|0}))
如果输入4个婴儿车,则有效,但如果只输入两个参数则不行。这让我发疯了!
非常感谢任何线索。
杰森
答案 0 :(得分:0)
我认为你很接近 - 可能会有更好的循环方法,但我确实倾向于采用你的方式。
我看到你是如何做非捕获下划线,然后捕获下一个字符。而不是寻找不斜线,寻找不下划线。通过非斜线,它将在第一组中抓住整个事物。也就是说,寻找下划线而不是下划线。
然后(进入真正的修复),每个部分都需要是可选的 - 上面的规则需要四个部分。那么添加一个?到每一个结尾,如:
RewriteRule ^climbing-frames(?:_([^_]+))(?:_([^_]+))?(?:_([^_]+))?(?:_([^_]+))?/
我离开了第一组,因为它几乎应该在那里,而RewriteCond正在检查它。