Grails, by default, is case-sensitive when mapping URL to controller actions or views.
For instance, www.mywebsite.com/book/list will work BUT www.mywebsite.com/Boo
Aaron Saunders has as great solution here, but his site was blocked for me. Here is his fantastic solution. Confirmed it works great in Grails 2.x.
import org.codehaus.groovy.grails.commons.GrailsClass
class UrlMappings {
def grailsApplication
static mappings = {
"/$controller/$action?/$id?"{
constraints {
// apply constraints here
}
}
//Case InSeNsItIvE URLS!!!
"/$_ctrl/$_action/$id?" {
controller = {
def foundControllerMatch = false
def returnCtrl = params._ctrl
grailsApplication.controllerClasses.each { GrailsClass c ->
def l_className = c.name.toLowerCase()
// find the class
if (params._ctrl?.equalsIgnoreCase(l_className) && foundControllerMatch == false) {
foundControllerMatch = true
returnCtrl = c.getLogicalPropertyName()
//println " foundControllerMatch ${returnCtrl}"
}
}
return returnCtrl
}
action = {
def foundActionMatch = false
def returnAction = params?._action
def returnCtrl = params._ctrl
grailsApplication.controllerClasses.each { GrailsClass c ->
def l_className = c.name.toLowerCase()
// find the class
if (params._ctrl?.equalsIgnoreCase(l_className) && foundActionMatch == false) {
returnCtrl = c.name
c.URIs.each { _uri ->
if (foundActionMatch == false) {
def uri = _uri
//println "u-> $uri"
def uri_action
uri_action = uri.split('/')[2]
//println "uri_action-> $uri_action"
if (uri_action?.trim()?.equalsIgnoreCase(params._action.trim())) {
foundActionMatch = true
returnAction = uri_action
}
}
}
}
}
return returnAction
}
}
}
}