我正在使用AngularJS ui路由进行路由,我想删除#(来自URL的哈希)。我正在使用此代码,也正在我的index.html文件中使用(base href =“ /”)。它工作正常,但是当我刷新(http://0.0.0.0:3000/athletepersonalinfo)之类的页面时,出现了错误。

.config(function($stateProvider,$locationProvider) {
   $locationProvider.html5Mode({ enabled: true, requireBase: false })
   $stateProvider
   .state('/', {
    url: '',
    templateUrl:HTML.HOME,
    controller: 'homeController as home'
    })
   .state('home', {
    url: '/',
    controller: 'homeController as home',
    templateUrl: HTML.HOME
    })

    .state('athletepersonalinfo', {
    url: '/athletepersonalinfo',
    controller: 'athleteProfileInfo',
    templateUrl: HTML.ATHLETE_PERSONAL_INFO,
    authenticate: true
  })

最佳答案

当您单击刷新时,服务器实际上会尝试查找给定的路由是否已定义为/athletepersonalinfo。要从网址中实际删除#,您必须添加一个get(/*)路由,该路由将始终返回您的index.html页面。此路由应位于所有其他路由之后。现在,这意味着只要未定义路线,您的index.html就将被投放,而在客户端,angular将处理要加载的视图。进行此类攻击时要注意的几点


由于任何未解决的get都可能返回index.html,因此请确保您的路由有意义,就像所有资产都以/ assets / path开头一样,因此所有api调用都应以/ api /开头。
这样做的好处是,如果在某些资产上获得404或api调用,您仍然会得到index.html,这是错误的。但是使用这种方法,您需要做的就是设置一条类似这样的路线

app.get('/:url(api|assets)/*',function(req,res){
    res.status(400).send("Not Found")
});

app.get('/*',function(req,res){
    res.sendFile('index.html');
});

确保在所有其他路由之后定义*路由,否则您将为每个请求不断获取index.html。


希望这可以帮助。

关于javascript - AngularJS ui路由哈希前缀,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38722410/

10-16 21:11