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

使用自定义域名时,如何记录Firebase托管Express API的请求主机名

获取客户端真实请求URL的解决方案

当Firebase Cloud Function绑定自定义域名后,请求会经过Firebase的反向代理转发,导致req.hostname返回的是Cloud Function的默认域名,而客户端实际使用的自定义域名会被放在x-forwarded-host请求头中。要记录完整的客户端请求URL,可以通过以下方式实现:

  1. 添加自定义Express中间件,提取真实请求信息
    在现有中间件之前新增一个中间件,用来解析并拼接真实的请求URL:
const app = express();

// 新增中间件:解析并记录客户端真实请求URL
app.use((req, res, next) => {
  // 优先从x-forwarded-host获取自定义域名, fallback到默认hostname
  const realHost = req.headers['x-forwarded-host'] || req.hostname;
  // 获取真实请求协议(自定义域名通常用HTTPS,x-forwarded-proto会传递客户端实际用的协议)
  const protocol = req.headers['x-forwarded-proto'] || 'https';
  // 拼接完整URL:协议 + 主机 + 原始路径及查询参数
  const realRequestUrl = `${protocol}://${realHost}${req.originalUrl}`;

  // 记录URL到日志(可替换为你的日志工具)
  console.log(`客户端请求URL: ${realRequestUrl}`);

  // 将真实URL挂载到req对象,方便后续路由/中间件直接使用
  req.realRequestUrl = realRequestUrl;

  next();
});

app.use(cors);
app.use(debug);

app.get('/api/endpoint1', authenticate, endpoint1Handler);
app.post('/api/endpoint2', authenticate, validateParams([...]), endpoint2Handler);
app.get('/api/doc', (req, res) => res.send(docHtml));

export default region(...).runWith(...).https.onRequest(app);
  1. 关键细节说明
  • x-forwarded-host:Firebase反向代理会将客户端请求的原始主机名放在这个头里,这就是用户实际访问的自定义域名
  • x-forwarded-proto:用来获取客户端实际使用的协议(HTTP/HTTPS),避免内部转发的协议干扰
  • 保留fallback逻辑:当直接访问Cloud Function默认域名时,x-forwarded-host不存在,此时用req.hostname保证功能正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:39:57