如何在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
相关产品推荐
相关产品推荐

