koa-router 多域名路由配置求助
发布于 9 年前 作者 wk472150269 6898 次浏览 最后一次编辑是 8 年前 来自 问答

最近使用koa-router 碰到了个问题,nginx 配置了 xx.comadmin.xx.com 指向同一个项目,路由配置如下:

routerConfig.js
    var Router = require('koa-router');
    var wwwController = require('./www/controller/index');
    var adminController = require('./admin/controller/index');

    var wwwRouter = new Router();
    var adminRouter = new Router();

    wwwRouter.get('/', wwwController.show);
    adminController.get('/', adminController.list);

    module.exports.www = wwwRouter;
    module.exports.admin = adminRouter;
    
app.js
    var routerConfig = require('routerConfig');
    var Router = require('koa-router')();
    for(var _router in routerConfig) {
        Router.use(routerConfig[_router].routes());
    }
    app.use(Router.routes());

现在访问 xx.com 是正常的,但是访问 admin.xx.com 还是匹配到了 wwwRouter 的 / ,查了下 koa-router 的 wiki ,貌似只能通过给 adminRouter 加 prefix 解决,但是这样子的话 admin.xx.com 的路由就统一多了个 prefix ,请教下大家有没有办法可以通过 host 配置,或者是我这写的不对?谢谢。

另外,我昨天改cnode密码的邮件到现在都没收到。。。

7 回复

你写的这两个路由冲突,路径一样啊,只会有一个起作用。 你可以在程序里给admin加个prefix,然后在nginx做代理的时候把域名转换为带prefix的。

感觉你这像是两个域名 >admin.xx.comxx.com的子域名,居然是多个域名为啥写在一个app里,分app吧

@FoghostCn 多谢回复,确实冲突了,因为权限的问题我不能直接改nginx的配置,所以就想知道有没有办法通过host配置,看起来只能是加prefix了

@ncuzp 多谢回复,我是在同一个项目下分不同的app目录,但是启动的时候是一个启动文件,同时定义了前后台的所有路由,想通过host区分前后台,再加上路由定位到不同的app,你的意思是分成两个不同的项目么?

@wk472150269 是的,看起来你的是不同的域名访问同一个项目,你的app只是你自己逻辑上的划分,实际访问的还是同一个应用, 不好区分的,要不你就后台开多个api进程然后根据不同的host访问不同的api进程数据 😄

@ncuzp 多谢,要是koa-router支持host+prefix区分就好了 😄

可以写死

app.use(function* (next){
  var router;
  if(this.get('host') === 'xx.com'){
    router = wwwRouter;
  } else if (this.get('host') === 'admin.xx.cim'){
    router = adminRouter;
  }
  return yield  router.routes().call(this, next);
});
回到顶部