使用express-subdomain时如何阻止blog子域名访问主站非对应路由
Express子域名路由隔离问题解决方案
问题原因
Express 中间件按照注册顺序全局匹配执行,当前仅对blog子域名的请求做了定向处理,挂载在全局的/api路由没有添加子域名限制,因此只要路径匹配/api规则,无论来自哪个子域名的请求都会触发mainRouter逻辑。
解决方案
方案1:给主站路由绑定子域名限制(推荐)
直接使用express-subdomain给主站的/api路由添加www子域名匹配规则,修改index.js代码如下:
// index.js // 处理所有blog子域名的请求 app.use(subdomain("blog", blogRouter)); // 仅www子域名下的/api路径请求会进入mainRouter处理 app.use("/api", subdomain("www", mainRouter));
如果需要兼容裸域名(如直接访问mysite.com/api)的场景,用方案2更灵活。
方案2:自定义子域名校验中间件
自行实现中间件校验请求来源的子域名,满足条件才放行到主站路由:
// index.js app.use(subdomain("blog", blogRouter)); // 主站子域名校验中间件 const validateMainSubdomain = (req, res, next) => { const host = req.get('host'); // 可自定义允许的主站域名,比如同时支持裸域名和www子域名 const allowedHosts = ['mysite.com', 'www.mysite.com']; if (allowedHosts.includes(host)) { return next(); } // 非主站域名请求直接返回404 return res.sendStatus(404); } // 先校验子域名,校验通过才进入主站路由 app.use("/api", validateMainSubdomain, mainRouter);
补充:全局404处理
建议在所有路由注册完成后添加全局404处理中间件,统一处理未匹配到任何路由的请求:
// 所有路由注册完成后添加 app.use((req, res) => { res.status(404).send('页面不存在'); });
内容的提问来源于stack exchange,提问作者HTB
相关产品推荐
相关产品推荐

