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

什么是account.example.com这类URL命名?如何在Express.js中配置?

问题解答

1. 这类URL的命名方式

account.example.com、blog.example.com这类URL的命名叫做子域名(Subdomain),是域名系统中主域名(如example.com)的下级域名,通常用于区分网站的不同功能模块、业务线或服务入口。

2. Express.js中配置多子域名的实现步骤

前置准备

  • 本地开发环境:修改系统hosts文件,添加子域名到本地IP的映射(Windows路径:C:\Windows\System32\drivers\etc\hosts;Linux/macOS路径:/etc/hosts):
    127.0.0.1 store.example.com
    127.0.0.1 account.example.com
    127.0.0.1 learn.example.com
    127.0.0.1 services.example.com
    
  • 生产环境:在域名服务商后台配置A记录或CNAME记录,将所有子域名指向你的服务器IP。

方法一:使用vhost中间件(推荐,模块化程度高)

  1. 安装依赖:
    npm install vhost --save
    
  2. 编写代码,为每个子域名创建独立的Express应用实例:
    const express = require('express');
    const vhost = require('vhost');
    
    // 主应用容器
    const app = express();
    
    // 初始化各子域名对应的独立应用
    const storeApp = express();
    const accountApp = express();
    const learnApp = express();
    const servicesApp = express();
    
    // 配置store子域名路由
    storeApp.get('/', (req, res) => {
      res.send('欢迎访问 store.example.com');
    });
    storeApp.get('/products', (req, res) => {
      res.send('商品列表页');
    });
    
    // 配置account子域名路由
    accountApp.get('/', (req, res) => {
      res.send('欢迎访问 account.example.com');
    });
    accountApp.get('/profile', (req, res) => {
      res.send('用户中心');
    });
    
    // 配置learn子域名路由
    learnApp.get('/', (req, res) => {
      res.send('欢迎访问 learn.example.com');
    });
    
    // 配置services子域名路由
    servicesApp.get('/', (req, res) => {
      res.send('欢迎访问 services.example.com');
    });
    
    // 将子域名与对应应用绑定
    app.use(vhost('store.example.com', storeApp));
    app.use(vhost('account.example.com', accountApp));
    app.use(vhost('learn.example.com', learnApp));
    app.use(vhost('services.example.com', servicesApp));
    
    // 启动服务
    app.listen(3000, () => {
      console.log('服务已启动在3000端口');
    });
    

方法二:手动解析Hostname(无需额外依赖)

直接通过req.hostname判断子域名,分发路由逻辑:

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

// 中间件:提取子域名
app.use((req, res, next) => {
  const [subdomain] = req.hostname.split('.');
  req.currentSubdomain = subdomain;
  next();
});

// 按子域名分发路由
app.get('/', (req, res) => {
  switch(req.currentSubdomain) {
    case 'store':
      res.send('欢迎访问 store.example.com');
      break;
    case 'account':
      res.send('欢迎访问 account.example.com');
      break;
    case 'learn':
      res.send('欢迎访问 learn.example.com');
      break;
    case 'services':
      res.send('欢迎访问 services.example.com');
      break;
    default:
      res.send('主域名页面');
  }
});

// 也可为子域名挂载独立路由模块
const storeRouter = express.Router();
storeRouter.get('/cart', (req, res) => {
  res.send('购物车页面');
});

app.use((req, res, next) => {
  if (req.currentSubdomain === 'store') {
    storeRouter(req, res, next);
  } else {
    next();
  }
});

app.listen(3000, () => {
  console.log('服务已启动在3000端口');
});

生产环境注意事项

  • 如果使用Nginx等反向代理,需确保配置中转发Host头,否则Express无法获取正确的子域名:
    proxy_set_header Host $host;
    
  • HTTPS场景下,需为每个子域名配置SSL证书,或使用通配符证书(*.example.com)覆盖所有子域名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:52:46