3

我正在尝试为特定控制器(和操作)重写我的网址,例如:

www.mysite.com/user/search?sex=male&from_age=18&to_age=19

会成为

www.mysite.com/user/search/sex/male/from_age/18/to_age/19

我知道我可以使用 Grails 的 url 重写来做到这一点:

"/user/search/sex/$Sex/from_age/$from_age/to_age/$to_age" {
  controller = 'user'
  action = 'search'
}

我面临的问题是用户可以轻松触发如下网址:

www.mysite.com/user/search/sex/male/to_age/19/location/chicago

即 url 根据用户在搜索表单中输入的搜索条件是动态的

无论如何,是否可以按照 Apache 的方式动态重写 url,mod_rewrite这样我就可以param_name/param_value代替?param_name=param_value?

4

1 回答 1

2

您可以将通配符 url 映射到您的搜索操作,但您必须自己执行参数解析:

UrlMappings.groovy:

"/user/search/$query**" {
    controller = 'user'
    action = 'search'
}

这将为您提供 url 的静态部分之后的所有内容作为单个字符串。

www.mysite.com/user/search/sex/male/to_age/19/location/chicago会给你params.query = 'sex/male/to_age/19/location/chicago'

但是,这些类型的 url 不参与动态 url 重写,因此您在尝试链接到它时必须自己构建 url。

将 paramMap 转换为该样式的查询字符串的快速不安全(未转义)示例:

def queryStr = params.collect({ n,v -> "$n/$v" }).join('/')
g.createLinkTo(controller: 'user', action: 'search', params: [query: queryStr])
于 2013-07-24T16:24:48.597 回答