Loopback中子域名路由至多个静态Angular应用的实现问题咨询
子域名路由解决方案:Loopback + Angular 2
我之前维护多客户端的Loopback项目时,也碰到过和你一模一样的需求——从子目录部署切换到子域名,Loopback确实没有内置的子域名路由机制,但咱们可以通过自定义中间件或者调整现有逻辑来搞定,甚至能直接复用你之前子目录部署的调试好的代码!
方案1:自定义子域名路由中间件(最推荐)
这个思路是在请求到达静态文件服务或API路由之前,先根据子域名重写请求路径,完美复用你已经跑通的子目录部署逻辑。
步骤1:创建自定义中间件文件
在server/middleware目录下新建subdomain-router.js,代码如下:
module.exports = function(options) { return function subdomainRouter(req, res, next) { // 获取请求的主机名(注意:如果用了反向代理,要确保Host头正确传递) const hostname = req.hostname; // 正则匹配你的子域名规则,比如匹配www.subdomain.mysite.com格式 const subdomainRegex = /^www\.([a-z0-9-]+)\.mysite\.com$/i; const match = hostname.match(subdomainRegex); if (match) { const subdomain = match[1]; // 重写req.url,把请求指向对应的子目录 // 假设你的两个Angular构建产物分别放在server/public/app1和server/public/app2 req.url = `/${subdomain}${req.url}`; } // 继续执行后续中间件 next(); }; };
步骤2:在middleware.json中注册中间件
把这个自定义中间件放在files中间件之前,这样重写后的路径会被静态文件服务正确识别:
{ "initial": { "./middleware/subdomain-router": {} }, "files": { "loopback#static": { "params": "$!../public" } }, // 保留其他原有中间件配置... }
方案2:优化你尝试的url-not-found-handler思路
如果你想继续用final阶段的url-not-found-handler来处理,也可以调整逻辑,直接根据子域名返回对应的Angular入口文件:
// server/middleware/url-not-found-handler.js module.exports = function(options) { return function urlNotFoundHandler(req, res, next) { const hostname = req.hostname; let angularIndexPath = '/index.html'; // 默认入口 if (hostname === 'www.app1.mysite.com') { angularIndexPath = '/app1/index.html'; } else if (hostname === 'www.app2.mysite.com') { angularIndexPath = '/app2/index.html'; } // 返回对应的Angular入口文件 res.sendFile(angularIndexPath, { root: './server/public' }, (err) => { if (err) { next(err); } }); }; };
不过这个方案只适合处理前端路由的404情况,不如方案1全面——方案1能同时覆盖静态资源和API路由的子域名区分。
关键注意事项
- 反向代理配置:如果你用Nginx或者Apache做反向代理,一定要确保把
Host头正确传递给Loopback,比如Nginx里要加:
否则proxy_set_header Host $host;req.hostname会拿到代理服务器的主机名,而不是用户请求的子域名。 - Angular路由配置:确保Angular的
baseHref设置正确,或者用相对路径,避免子域名下的路由跳转出问题。
内容的提问来源于stack exchange,提问作者Jackson Vaughan
相关产品推荐
相关产品推荐

