我有一个支持angularjs前端的grails应用程序。它们被部署为单个WAR。我已从应用中删除了上下文路径,以便它在http://localhost:8080
上运行。
我有一个文章列表,我有$routeProvider
设置将/
重定向到/articles
,此时控制器接管并通过$http
拉取列表。非常标准的东西。
最初,我使用默认位置提供程序配置,在URL中使用哈希(#)
。我通过
$locationProvider.html5Mode(true);
一切都还行。但是,如果我直接在地址栏中更改URL并按Enter键,或者如果我只是在/ articles时刷新浏览器,则服务器端接管并且我只是将我的文章列表作为json。没有角度。我理解为什么会发生这种情况,现在我所做的是在服务器上检测到非ajax请求并发出重定向到/
,这将允许角度启动。
我想知道这是否正确。或者我还能做些什么,这是一种更好的做法。
答案 0 :(得分:3)
重定向是正确的解决方案。
我能够使用url映射使其工作。到目前为止它的工作原理:-)
我从这样的事情开始:
"/**" (controller: 'app', action: 'index')
app / index是角度应用页面。但这也将匹配其他所有内容(例如/ $ controller / $ action)。我必须将每个$ controller / $动作显式映射到正确的控制器。不太好......; - )
为了解决这个问题,我为所有uris添加/client
前缀为角度路由,/server
为grails uris添加前缀。这使得URL映射变得容易,并且有助于区分角度路径和模板uris等。
我的最终网址映射如下所示:
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 {
}
}
}
}
你不能直接在url映射中重定向,所以我使用一个简单的控制器:
class RedirectController {
def redirectTo () {
redirect (uri: params.to, permanent: params.permanent)
}
}
路由条目如下所示:
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
答案 1 :(得分:0)
这里刚刚回答了这个问题 angularjs html5mode refresh page get 404
确保您在服务器上重写规则正确