Express vhost配置子域名绑定实际域名后无法正常生效问题排查
问题:Express vhost部署到Heroku后子域名无法正确路由
我编写了如下Express代码:
const app = express(); const accountApp = express(); const publicApp = express(); publicApp.use(express.static(path.join(process.cwd(), "web/dist/public"))); accountApp.use(express.static(path.join(process.cwd(), "web/dist/account"))); app.use(vhost('account.*', accountApp)); app.use(publicApp);
本地环境运行正常:http://localhost:3000显示public应用,http://account.localhost:3000显示account应用。但部署到Heroku并完成Heroku域名配置、Google Domains DNS配置后,访问www.stravamenu.com能正常显示public应用,account.stravamenu.com却仍显示public应用,而非account应用。请问问题出在vhost配置、Heroku部署还是Google Domains设置中?
排查方向:
1. Google Domains DNS配置
- 确认
account.stravamenu.com的DNS记录类型为CNAME,指向你的Heroku应用域名(例如xxx.herokuapp.com),而非A记录(Heroku的IP会动态变化,A记录会失效)。 - 用命令验证DNS是否生效:
nslookup account.stravamenu.com,检查返回的域名是否与www.stravamenu.com一致,或正确指向Heroku应用的域名。
2. Heroku自定义域名配置
- 确认Heroku应用设置中已添加
account.stravamenu.com作为自定义域名,且完成了域名验证(若有要求)。 - 确认Heroku未修改请求的
Host头:Heroku默认会转发原始Host头,但需确保没有自定义配置覆盖这一行为。
3. Express vhost配置与调试
- 你的
account.*规则理论上能匹配account.stravamenu.com,但需确认请求的Host头是否正确传递到Express应用。可以添加调试中间件打印Host信息:
部署后查看Heroku日志,确认访问app.use((req, res, next) => { console.log('当前请求Host:', req.headers.host); next(); });account.stravamenu.com时打印的Host是否正确。 - 确保vhost中间件在
publicApp之前注册(你的代码已满足,但需排查是否有其他中间件干扰Host头)。
内容的提问来源于stack exchange,提问作者1baz
相关产品推荐
相关产品推荐

