如何为Firebase V2函数配置Cloudflare代理防护并解决404报错
解决Firebase V2函数Cloudflare CNAME代理后出现Google 404的问题
问题根源
Firebase V2(即Cloud Functions 2nd gen)的a.run.app域名会校验请求的Host头。你直接把自定义域名CNAME指向函数默认域名后,请求的Host是你的自定义域名(比如api.yourdomain.com),和函数的合法域名不匹配,所以Google返回404页面。
修复步骤
- 绑定Firebase官方自定义域名(推荐方案)
- 打开Firebase控制台,进入你的项目,找到「函数」→「自定义域名」选项。
- 添加你的自定义域名(比如
api.yourdomain.com),跟着指引完成DNS验证——在Cloudflare后台添加Firebase要求的TXT记录。 - 等待Google完成域名部署(通常需要几分钟到几小时),部署完成后,Firebase会给出一个目标域名(一般是
ghs.googlehosted.com这类)。 - 在Cloudflare后台把CNAME记录的目标改成这个官方给出的域名,而不是直接指向
a.run.app地址。
- 临时方案:强制转发Host头(不推荐长期使用)
如果不想走官方绑定,可以在Cloudflare用Worker修改请求的Host头:
注意:这种方法可能触发Google的安全校验,稳定性没有官方绑定高。addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) async function handleRequest(request) { const targetHost = "*****-****-function-name-*****-***.a.run.app" const url = new URL(request.url) url.host = targetHost // 复制原请求的所有参数,替换Host const modifiedReq = new Request(url, { method: request.method, headers: request.headers, body: request.body, redirect: request.redirect }) return fetch(modifiedReq) } - 检查Cloudflare基础设置
- 把SSL模式设为「严格(Full)」,避免SSL握手出错。
- 针对该域名关闭缓存,或者设置缓存策略为不缓存动态请求,防止旧的404响应被缓存。
验证方式
用curl测试请求,确认返回函数的正常响应:
curl -v https://api.yourdomain.com/你的函数路径
内容的提问来源于stack exchange,提问作者Patman
相关产品推荐
相关产品推荐

