Grails 刷新浏览器会绕过基于routerProvider的URL

Grails 刷新浏览器会绕过基于routerProvider的URL,grails,angularjs,Grails,Angularjs,我有一个支持angularjs前端的grails应用程序。它们作为一场战争部署。我已从应用程序中删除了上下文路径,以便它在http://localhost:8080 我有一个文章列表,我有$routeProvider设置将/重定向到/articles,此时控制器接管并通过$http提取列表。相当标准的东西 最初,我使用默认的位置提供程序配置,在URL中使用哈希值(#)。我已经通过 $locationProvider.html5Mode(true); 而且一切都还正常。但是,如果我直接在地址栏中

我有一个支持angularjs前端的grails应用程序。它们作为一场战争部署。我已从应用程序中删除了上下文路径,以便它在
http://localhost:8080

我有一个文章列表,我有
$routeProvider
设置将
/
重定向到
/articles
,此时控制器接管并通过
$http
提取列表。相当标准的东西

最初,我使用默认的位置提供程序配置,在URL中使用哈希值
(#)
。我已经通过

$locationProvider.html5Mode(true);
而且一切都还正常。但是,如果我直接在地址栏中更改URL并按enter键,或者当浏览器位于/articles时我只是刷新浏览器,服务器端就会接管,我只会将文章列表作为json。没有棱角。我理解为什么会发生这种情况,现在我所做的是在服务器上检测到一个非ajax请求,并发出一个重定向到
/
,这将允许angular启动


我想知道这是不是对的。或者我还能做些什么更好的练习。

刚刚回答了这个问题


请确保您在服务器上正确地重写规则

重定向是正确的解决方案

我能够使用url映射使其工作。到目前为止,它是有效的:-)

我是这样开始的:

"/**" (controller: 'app', action: 'index') 
class UrlMappings {
    static excludes = [
        "/lib/**",
        "/css/**",
        "/js/**"
    ]

    static mappings = {
        // - all client uris (routes) will start with '/client/',
        // - all server uris (load)   will start with '/server/'

        // redirect /$appName/ to /$appName/client
        "/" (controller: 'redirect', action: 'redirectTo') {
            to = '/client/'
            permanent = true
        }

        // redirect any angular route       
        "/client/**" (controller: 'app', action: 'index')


        // standard controller/action mapping
        "/server/$controller/$action/$id?"  {
            constraints {
            }
        }
    }
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
应用程序/索引为角度应用程序页面。但这也将匹配其他所有内容(例如,/$controller/$action)。我必须明确地将每个$controller/$操作映射到正确的控制器。不太好…;-)

为了解决这个问题,我在所有URI前面加上
/client
作为角度路由的前缀,在
/server
作为GrailsURI的前缀。这使得url映射变得容易,并且有助于区分角度路由和模板URI等

我的最终url映射如下所示:

"/**" (controller: 'app', action: 'index') 
class UrlMappings {
    static excludes = [
        "/lib/**",
        "/css/**",
        "/js/**"
    ]

    static mappings = {
        // - all client uris (routes) will start with '/client/',
        // - all server uris (load)   will start with '/server/'

        // redirect /$appName/ to /$appName/client
        "/" (controller: 'redirect', action: 'redirectTo') {
            to = '/client/'
            permanent = true
        }

        // redirect any angular route       
        "/client/**" (controller: 'app', action: 'index')


        // standard controller/action mapping
        "/server/$controller/$action/$id?"  {
            constraints {
            }
        }
    }
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
您无法在url映射中直接重定向,因此我使用一个简单的控制器:

class RedirectController {
    def redirectTo () {
        redirect (uri: params.to, permanent: params.permanent)
    }
}
路由条目如下所示:

"/**" (controller: 'app', action: 'index') 
class UrlMappings {
    static excludes = [
        "/lib/**",
        "/css/**",
        "/js/**"
    ]

    static mappings = {
        // - all client uris (routes) will start with '/client/',
        // - all server uris (load)   will start with '/server/'

        // redirect /$appName/ to /$appName/client
        "/" (controller: 'redirect', action: 'redirectTo') {
            to = '/client/'
            permanent = true
        }

        // redirect any angular route       
        "/client/**" (controller: 'app', action: 'index')


        // standard controller/action mapping
        "/server/$controller/$action/$id?"  {
            constraints {
            }
        }
    }
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});

有一个原因可以解释为什么不能使用
#
s的标准方式?不完全是这样。我只是想学习angularjs,并尝试不同的方法,看看什么最适合我想要实现的目标。