Firebase自定义域名下Google Cloud Function无法获取请求头问题
解决Firebase自定义域名下Cloud Function无法获取请求头的问题
我之前也踩过这个坑!当用Firebase自定义域名访问Cloud Function时,请求头莫名丢失,大概率是Firebase Hosting的转发规则或者CORS配置在搞鬼,咱们一步步来搞定:
可能的原因&解决方案
1. Firebase Hosting转发时过滤了请求头
Firebase Hosting默认转发请求到Cloud Function时,会把一些自定义请求头给过滤掉。你得在firebase.json的重写规则里明确告诉它要保留哪些头:
修改你的firebase.json,在对应重写规则里加上headers配置,把你需要的请求头一一列出来:
{ "hosting": { "rewrites": [ { "source": "/NowShowing", "function": "NowShowing", "headers": { "X-Your-Custom-Header": "$request.headers.X-Your-Custom-Header", "Authorization": "$request.headers.Authorization" // 把所有你需要获取的请求头都这么配置 } } ] } }
注意这里的格式是"目标头名": "$request.headers.原请求头名",要和你实际用的请求头对应上。
2. CORS中间件没允许携带自定义头
看你代码里用到了cors,很可能是CORS配置没放开允许携带你需要的请求头。调整下CORS的配置:
const cors = require('cors')({ origin: true, // 或者直接指定你的自定义域名,比如"https://xxx.firebaseapp.com" allowedHeaders: ['Content-Type', 'Authorization', 'X-Your-Custom-Header'], // 列出所有需要的请求头 credentials: true }); exports.NowShowing = functions.https.onRequest((request, response) => { cors(request, response, () => { // 这里要注意:Node.js里request.headers的键都是小写的! const requiredHeader = request.headers['x-your-custom-header']; if (!requiredHeader) { return response.status(400).send('Missing required header'); } // 接下来就可以正常执行你的业务逻辑啦 response.send('All good!'); }); });
别踩大小写的坑,比如你前端传的是X-Your-Custom-Header,后端要拿request.headers['x-your-custom-header']才行。
3. 缓存策略搞的鬼
有时候Firebase Hosting的缓存会篡改或者忽略请求头,给你的路由加上不缓存的配置:
{ "hosting": { "headers": [ { "source": "/NowShowing", "headers": [ { "key": "Cache-Control", "value": "no-cache, no-store, must-revalidate" } ] } ] } }
最后验证下
- 先部署Hosting的配置:
firebase deploy --only hosting - 再重新部署你的Function:
firebase deploy --only functions:NowShowing - 用curl或者Postman测一下自定义域名的请求,带上需要的头,应该就能正常获取了!
内容的提问来源于stack exchange,提问作者allo
相关产品推荐
相关产品推荐

