AngularJS:如何使用深度链接启用$locationProvider.html5模式
当通过AngularJS:如何使用深度链接启用$locationProvider.html5模式,angularjs,Angularjs,当通过$locationProvider.html5Mode(true)在AngularJS中启用HTML5模式时,当您在站点中更深的页面上着陆时,导航似乎会倾斜 例如: http://www.site.com 当我导航到根目录时,我可以单击站点中的所有链接,Angular的$routeProvider将接管整个站点的导航并加载正确的视图 http://www.site.com/news/archive 但是当我导航到这个url(或者当我在上面这样的深度链接上时点击刷新…)时,这个导航并没有像
$locationProvider.html5Mode(true)
在AngularJS中启用HTML5模式时,当您在站点中更深的页面上着陆时,导航似乎会倾斜
例如:
http://www.site.com
当我导航到根目录时,我可以单击站点中的所有链接,Angular的
将接管整个站点的导航并加载正确的视图$routeProvider
http://www.site.com/news/archive
但是当我导航到这个url(或者当我在上面这样的深度链接上时点击刷新…)时,这个导航并没有像我期望的那样工作。 首先,按照指定,我们捕获服务器上的所有URL,类似于angular中的路由,并返回与根域相同的html。但是如果我随后从angular的
函数中检查run
对象,它会告诉我$location
是我的http://www.site.com
,而主机
是我的/archive
。路径
到达$routeProvider
子句,因为我只有.otherwise()
作为有效路由。这个应用程序做了一些奇怪的事情/news/archive
/news
段的路径
示例main.js:
// Create an application module
var App = angular.module('App', []);
App.config(['$routeProvider', '$locationProvider', function AppConfig($routeProvider, $locationProvider) {
$routeProvider
.when(
'/', {
redirectTo: '/home'
})
.when('/home', {
templateUrl: 'templates/home.html'
})
.when('/login', {
templateUrl: 'templates/login.html'
})
.when('/news', {
templateUrl: 'templates/news.html'
})
.when('/news/archive', {
templateUrl: 'templates/newsarchive.html'
})
// removed other routes ... *snip
.otherwise({
redirectTo: '/home'
}
);
// enable html5Mode for pushstate ('#'-less URLs)
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');
}]);
// Initialize the application
App.run(['$location', function AppRun($location) {
debugger; // -->> here i debug the $location object to see what angular see's as URL
}]);
编辑
根据请求,有关服务器端的更多详细信息:
服务器端是由zend framework的路由组织的,它处理自己的路由(用于在特定的/api
URL上向前端提供数据,并且在最后,有一个包罗万象的路由。如果没有绑定特定的其他路由,它将提供与根路由相同的html。
因此,它基本上是在深度链接的路径上提供主页html
更新2
在研究该问题后,我们注意到该布线在Angular 1.0.7 stable上运行良好,但在Angular 1.1.5 stable上显示了上述行为
我已经检查了变更日志,但到目前为止还没有发现任何有用的东西,我想我们可以将其作为bug提交,或者将其作为与他们所做的某个变更相关的不必要的行为提交,或者只是等待,看看它是否在稍后发布的稳定版本中得到修复。这个问题是由于使用了AngularJS 1.1.5(这是不稳定的,显然有一些bug或路由实现与1.0.7不同) 将其返回到1.0.7立即解决了问题 我已经尝试过1.2.0rc1版本,但还没有完成测试,因为我不得不重写一些路由器功能,因为他们从核心中取出了它
无论如何,当使用AngularJS vs 1.0.7时,这个问题已经修复。发现那里没有bug。 只需添加:
<base href="/" />
到您的
这是我花了比我愿意承认的更多的时间后发现的最好的解决方案。基本上,将target=“\u self”添加到每个链接,以确保页面重新加载
我的问题通过以下方法解决: 1-将此添加到您的头部:
<base href="/" />
你在服务器上是怎么做的?@johnled如果你需要比我在服务器端代码中添加的信息更多的信息,我可以让我的同事明天给我提供更具体的细节。我自己主要在这个项目的前端工作。感谢更新,我不久前玩过1.1.5不稳定的版本,它确实有很多bug。可能值得尝试新版本。我必须尝试:)我明天会给你回复,因为我肯定会尝试这个…但是目前我们已经运行1.2.0 rc2没有问题。虽然还没有测试1.2.0最终版本。但是我怀疑它会出问题,因为我们已经有了rc2。所以我们已经将它改成了单独的模块用于路由…小心,因为这会破坏所有的相对性我认为HTML5规范说base需要指向一个绝对的URIAlternative,使用
requireBase
属性。Set$locationProvider.html5mode({enabled:true,requireBase:false});
并且您不需要在HTML中使用
。我在使用SVG标记引用(例如,从单独的SVG文件a.k.a.paint server加载线性渐变)时遇到了这种情况,
(事实上,这就是为什么首先添加此选项的原因-请参阅:。在尝试了这么多解决方案后,这对我来说非常有用。谢谢!
$locationProvider.html5Mode(true);