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

如何在Node.js中将itemId暴露为动态二级子域名

Node.js实现itemId作为子域名访问的方案

前置配置:DNS泛解析

首先需要在你的域名服务商后台添加一条泛解析记录:将*.domainname.com的A/AAAA记录指向Node.js服务部署的服务器公网IP,所有带itemId的子域名请求才能正常路由到你的服务。

服务侧实现

Express框架示例

Express原生支持req.subdomains属性获取子域名列表,无需额外引入中间件:

const express = require('express');
const app = express();

// 子域名偏移量配置:主域为二级域名(如domainname.com)时设为2,主域为三级域名(如domainname.com.cn)时设为3
app.set('subdomain offset', 2);

// 原有路径形式的处理逻辑可直接复用
app.get('/:itemId', (req, res) => {
  res.send(`当前访问itemId:${req.params.itemId}`);
})

// 子域名请求处理
app.get('/', (req, res, next) => {
  const subdomains = req.subdomains;
  // 匹配仅带itemId的一级子域名请求
  if (subdomains.length === 1) {
    const itemId = subdomains[0];
    // 重写请求路径,转发到原有逻辑处理,无需重复开发
    req.url = `/${itemId}`;
    return next('route');
  }
  // 主域名访问的自有逻辑
  res.send('主域名页面');
})

// HTTPS服务需要额外配置泛域名SSL证书,可直接在express配置或者前置Nginx统一配置
app.listen(80, () => console.log('服务启动成功'));

Koa框架示例

需要引入koa-subdomain中间件处理子域名路由:

const Koa = require('koa');
const Router = require('@koa/router');
const subdomain = require('koa-subdomain');
const app = new Koa();
const router = new Router();
const subRouter = subdomain();

// 原有路径处理逻辑
router.get('/:itemId', async ctx => {
  ctx.body = `当前访问itemId:${ctx.params.itemId}`;
})

// 子域名通配处理
subRouter.use('*', async ctx => {
  const itemId = ctx.subdomains[0];
  // 直接复用原有逻辑即可
  ctx.body = `当前访问itemId:${itemId}`;
})

app.use(subRouter.routes());
app.use(router.routes());
app.listen(80);

注意事项

  • 需申请泛域名SSL证书,可同时匹配所有xxx.domainname.com格式的子域名,无需为每个itemId单独申请证书
  • 如果用Nginx做反向代理,可直接在Nginx侧解析子域名,通过自定义请求头将itemId传递给Node.js服务,无需修改Node侧路由逻辑
  • 需确保itemId符合子域名命名规范:仅支持英文字母、数字、横杠,且长度不超过63个字符,你给出的示例itemId符合规范可直接使用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:45:08