You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:18:05