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

Express中如何用Get方法处理完整URL/子域名及实现子域名重定向?

解答:Express子域名处理与重定向问题

嘿,我来帮你搞定这两个Express相关的问题!

一、在Express中结合完整URL/子域名使用GET方法

要结合子域名或完整URL处理GET请求,核心是先从请求中解析出子域名,再根据子域名逻辑处理路由。这里给你一个实用的实现思路:

首先,我们可以写一个全局中间件来解析子域名,把它挂载到请求对象上,方便后续路由使用:

// 全局中间件:解析子域名
app.use((req, res, next) => {
  const host = req.get('Host');
  // 拆分主机名,比如 api.sample.example.com 会拆成 ['api', 'sample', 'example', 'com']
  const hostParts = host.split('.');
  // 提取子域名(去掉最后的主域名部分,比如 example.com)
  req.subdomain = hostParts.slice(0, -2).join('.');
  next();
});

然后就可以在GET路由里根据子域名做逻辑处理了:

// 根路径的GET请求,根据子域名返回不同内容
app.get('/', (req, res) => {
  if (req.subdomain === 'api') {
    res.send('欢迎访问API子域名的GET接口!');
  } else if (req.subdomain === 'cdn') {
    res.send('这是CDN子域名的资源请求');
  } else {
    res.send('欢迎访问主域名!');
  }
});

// 针对特定子域名的GET接口
app.get('/topics', (req, res) => {
  if (req.subdomain === 'topics') {
    res.json({ data: '来自topics子域名的主题数据' });
  } else {
    res.status(403).send('该接口仅允许topics子域名访问');
  }
});

如果需要直接判断完整URL,也可以用req.protocol + '://' + req.get('Host') + req.originalUrl拿到完整地址再做匹配,但通常解析子域名的方式更灵活。

二、修复子域名重定向的无效问题

你的两段代码之所以无效,主要有几个关键问题:

  • 判断条件不匹配:你拼出来的fullUrl是包含协议、主机名和路径的完整地址,但判断时却用了'api.topics.example.com'(没有协议,也没考虑路径),自然永远匹配不上;
  • 重定向目标不完整:res.redirect(301, 'example.com')会被浏览器当成相对路径处理,必须用完整的http://example.com或https://example.com;
  • 缺少next()调用:第二个代码里如果不满足重定向条件,没有调用next()会导致请求卡住。

下面是修正后的可行方案:

方案1:全局重定向中间件(适合所有子域名跳主域名)

routes.use(function forceMainSite(req, res, next) {
  const host = req.get('Host');
  // 仅处理example.com相关的域名
  if (!host.endsWith('example.com')) {
    return next();
  }
  // 提取子域名部分(去掉末尾的.example.com)
  const subdomain = host.slice(0, -'.example.com'.length);
  // 如果存在子域名,就重定向到主域名,保留原路径
  if (subdomain) {
    const targetUrl = `${req.protocol}://example.com${req.originalUrl}`;
    return res.redirect(301, targetUrl);
  }
  // 主域名请求直接放行
  return next();
});

方案2:挂载到app的工具函数形式

module.exports = function(app, hbs) {
  return {
    redirBadLinks: function(req, res, next) {
      const host = req.get('Host');
      // 精准匹配sample.example.com子域名
      if (host === 'sample.example.com') {
        // 用完整URL重定向,保留原路径
        const targetUrl = `${req.protocol}://example.com${req.originalUrl}`;
        return res.redirect(301, targetUrl);
      }
      // 非目标子域名,一定要调用next()放行请求
      next();
    },
    // 其他工具方法...
  }
}

另外,测试环境没有真实子域名的话,可以修改本地hosts文件模拟:

  • Windows路径:C:\Windows\System32\drivers\etc\hosts
  • Mac/Linux路径:/etc/hosts
    添加以下内容:
127.0.0.1 example.com
127.0.0.1 api.example.com
127.0.0.1 sample.example.com

这样你在本地就能用不同子域名访问测试了。

内容的提问来源于stack exchange,提问作者Jerry Atric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:58:20