使用ISAPI重写进行URL重写

时间:2011-12-16 23:48:51

标签: url-rewriting

我正在尝试为产品创建过滤系统并保持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个婴儿车,则有效,但如果只输入两个参数则不行。这让我发疯了!

非常感谢任何线索。

杰森

1 个答案:

答案 0 :(得分:0)

我认为你很接近 - 可能会有更好的循环方法,但我确实倾向于采用你的方式。

我看到你是如何做非捕获下划线,然后捕获下一个字符。而不是寻找不斜线,寻找不下划线。通过非斜线,它将在第一组中抓住整个事物。也就是说,寻找下划线而不是下划线。

然后(进入真正的修复),每个部分都需要是可选的 - 上面的规则需要四个部分。那么添加一个?到每一个结尾,如:

RewriteRule ^climbing-frames(?:_([^_]+))(?:_([^_]+))?(?:_([^_]+))?(?:_([^_]+))?/

我离开了第一组,因为它几乎应该在那里,而RewriteCond正在检查它。