多个grails url映射

多个grails url映射,grails,url-routing,Grails,Url Routing,在我的Grails应用程序中,我有以下控制器&action class FestivalController { def show() { [festival: Festival.get(params.id)] } } 我希望以下所有URL都映射到此控制器 /festival/show/1 /festival/show/1/glastonbury /1/music/glastonbury 其中,glastonbury和music分别是节日的名称和类型。请注意,实际上只需要I

在我的Grails应用程序中,我有以下控制器&action

class FestivalController {

  def show() {
    [festival: Festival.get(params.id)]
  }
}
我希望以下所有URL都映射到此控制器

/festival/show/1
/festival/show/1/glastonbury
/1/music/glastonbury
其中,
glastonbury
music
分别是节日的名称和类型。请注意,实际上只需要ID(1)来标识节日,因此出于SEO和可读性(URL)的原因,URL中包含了名称和类型

我尝试使用以下URL映射来支持这些不同的URL

// this supports the 3rd mapping above
name showFestival: "/$id/$type?/$name?" {
    controller = "festival"
    action = "show"
}

// this supports the 1st mapping above
"/$controller/$action?/$id?/$name?"{
    constraints {           
    }
}
这些支持第一个和第三个URL映射,但是如果我尝试第二个

/festival/show/1/glastonbury
它不起作用。理想情况下,我希望Grails始终生成以下形式的URL:

/1/music/glastonbury
当我使用
g.createLink
g.link
时,我还希望以下URL映射到此操作(出于历史原因):


如果看不到其他映射规则,就很难知道哪些相关,哪些不相关。。。您看到的行为与通常的优先级规则不一致,我和他们都说,当两个映射可以应用于相同的传入URI时,获胜的映射就是具有以下内容的映射:

  • 更少的双通配符(
    **
    $var**
    ),或者如果两者相等,则
  • 更少的单个通配符(
    *
    $var
    ),或者如果两者相等,则
  • 更多非通配符路径段,或者如果两者相等,则
  • 最左边的通配符(
    /foo/*/baz
    胜过
    /foo/bar/*
    ),或者如果两者最左边的通配符位于同一位置,则
  • 具有更多
    约束的
  • 根据这些规则,
    /festival/show/1/glastonbury
    只匹配第二个映射,因此应该可以正常工作,但是
    /festival/show/1
    同时匹配这两个映射,因此应该由
    /$id/$type/$name
    拾取(更少的通配符),从而产生
    [控制器:'festival',操作:'show',id:'festival',type:'show',name:'1']


    “/festival/$action?/$id?/$name?”(控制器:'festival')
    添加显式规则应该可以解决问题,因为
    /festival/show/1
    将匹配此映射和
    /id/type/name
    映射,但是显式
    /festival/..
    映射有更多的非通配符路径段(1对无).

    如果看不到其他映射规则,就很难知道哪些相关,哪些不相关。。。您看到的行为与通常的优先级规则不一致,我和他们都说,当两个映射可以应用于相同的传入URI时,获胜的映射就是具有以下内容的映射:

  • 更少的双通配符(
    **
    $var**
    ),或者如果两者相等,则
  • 更少的单个通配符(
    *
    $var
    ),或者如果两者相等,则
  • 更多非通配符路径段,或者如果两者相等,则
  • 最左边的通配符(
    /foo/*/baz
    胜过
    /foo/bar/*
    ),或者如果两者最左边的通配符位于同一位置,则
  • 具有更多
    约束的
  • 根据这些规则,
    /festival/show/1/glastonbury
    只匹配第二个映射,因此应该可以正常工作,但是
    /festival/show/1
    同时匹配这两个映射,因此应该由
    /$id/$type/$name
    拾取(更少的通配符),从而产生
    [控制器:'festival',操作:'show',id:'festival',type:'show',name:'1']


    “/festival/$action?/$id?/$name?”(控制器:'festival')
    添加显式规则应该可以解决问题,因为
    /festival/show/1
    将匹配此映射和
    /id/type/name
    映射,但是显式
    /festival/..
    映射有更多的非通配符路径段(1对无).

    这两个映射是您定义的唯一映射吗?您能否附上完整的
    UrlMappings
    定义?到目前为止,我希望第二个URL(四个级别)可以工作,但第一个(
    /festival/show/1
    )不行。@IanRoberts这不是我的全部
    UrlMappings.groovy
    ,但它们是唯一两个相关的规则。我很惊讶,有多个URL指向同一内容会更好地进行SEO。@cdeszaq通常不是,但是我用`来表示哪一个重复的URL是首选选项这两个映射是您定义的唯一映射吗?您能否附上完整的
    UrlMappings
    定义?到目前为止,我希望第二个URL(四个级别)可以工作,但第一个(
    /festival/show/1
    )不行。@IanRoberts这不是我的全部
    UrlMappings.groovy
    ,但它们是唯一两个相关的规则。我很惊讶,有多个URL指向同一内容会更好地进行SEO。@cdeszaq通常不是,但我用`来表示哪个重复的URL是首选选项
    /festival/show/1
    /festival/show/1/glastonbury