什么是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中间件(推荐,模块化程度高)
- 安装依赖:
npm install vhost --save - 编写代码,为每个子域名创建独立的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
相关产品推荐
相关产品推荐

