使用自定义域名时,如何记录Firebase托管Express API的请求主机名
获取客户端真实请求URL的解决方案
当Firebase Cloud Function绑定自定义域名后,请求会经过Firebase的反向代理转发,导致req.hostname返回的是Cloud Function的默认域名,而客户端实际使用的自定义域名会被放在x-forwarded-host请求头中。要记录完整的客户端请求URL,可以通过以下方式实现:
- 添加自定义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);
- 关键细节说明
x-forwarded-host:Firebase反向代理会将客户端请求的原始主机名放在这个头里,这就是用户实际访问的自定义域名x-forwarded-proto:用来获取客户端实际使用的协议(HTTP/HTTPS),避免内部转发的协议干扰- 保留fallback逻辑:当直接访问Cloud Function默认域名时,
x-forwarded-host不存在,此时用req.hostname保证功能正常
内容的提问来源于stack exchange,提问作者Dast
相关产品推荐
相关产品推荐

