Firebase Cloud Function域名重定向中间件不生效问题排查
Firebase Hosting 备用域名跳转主域名失效修复
核心问题原因
你遇到的两个问题本质是配置错误+代码逻辑错误共同导致的:
a) 函数无法稳定持续触发
firebase.json中的重写规则存在配置冲突:单条rewrite规则不能同时指定静态资源目标destination和云函数目标function,二者是互斥的。当前配置下Firebase Hosting会直接忽略function字段,所有请求优先由CDN缓存直接返回静态index.html,根本不会转发到Cloud Function,自然不会产生新的函数运行日志。你看到的7:47的历史日志是配置生效前的残留触发记录。
另外CDN缓存也会放大这个问题:之前错误配置的响应被边缘节点缓存后,即使你更新了部署,短时间内刷新也会直接拿到缓存结果,不会回源触发函数。
b) 非规范域名访问不触发重定向
除了上述配置导致请求根本没到达函数层之外,现有函数代码本身也存在逻辑错误:
x-forwarded-host请求头返回的是纯主机名(例如example.com、www.example.com,本地调试时带端口),不会携带https://协议前缀,你代码中domains数组配置的域名带了协议前缀,永远无法匹配成功- 匹配逻辑写反:你把需要触发重定向的备用域名放进了允许放行的
domains列表,真正需要放行的规范主域名www.example.com反而不在列表中,即使匹配成功也会出现主域名被跳转、备用域名直接放行的反向效果 - 代码中存在多处域名拼写错误(如
exapmle、exampe),也会导致匹配失效
修复步骤
- 修正
firebase.json配置,删除重写规则中冲突的destination字段,让所有未匹配到静态资源的请求正确转发到云函数:
{ "hosting": { "public": "build", "ignore": [ "firebase.json", "**/.*", "**/node_modules/**" ], "rewrites": [ { "source": "**", "function": "redirectFunc" } ] } }
- 修正函数代码,修复域名匹配逻辑,补充静态资源托管能力适配前端SPA场景:
const functions = require('firebase-functions'); const express = require('express'); const url = require('url'); const path = require('path'); import type { Request, Response } from 'express'; const app = express(); // 配置1:无需重定向的合法域名(仅填写主机名,不带协议前缀) const allowedDomains = ['www.example.com', 'localhost:3000']; // 配置2:规范主域名根地址 const canonicalBase = 'https://www.example.com/'; // 静态资源目录,对应firebase.json中配置的public目录 const staticPath = path.join(__dirname, '../build'); // 托管静态资源 app.use(express.static(staticPath)); // 域名重定向中间件 app.use((req: Request, res: Response, next: any) => { const forwardedHost = req.headers['x-forwarded-host'] as string; const currentHost = forwardedHost || req.headers.host; // 非合法域名访问,执行301永久重定向 if (!allowedDomains.includes(currentHost)) { const targetPath = req.path.replace(/^\/+/, ""); const targetUrl = url.resolve(canonicalBase, targetPath); return res.status(301).redirect(targetUrl); } // 合法域名放行,进入静态资源处理逻辑 next(); }); // 兜底路由:适配SPA前端路由,未匹配到静态资源的路径统一返回index.html app.get('*', (req: Request, res: Response) => { res.sendFile(path.join(staticPath, 'index.html')); }); exports.redirectFunc = functions.https.onRequest(app);
注意:部署函数前需要将前端构建生成的
build目录放到Cloud Functions的部署包范围内,避免函数运行时找不到静态文件。可以将build目录复制到functions目录下,或者在functions/package.json的files字段中添加../build配置;代码中示例域名需要替换为你实际使用的业务域名。
- 重新全量部署:执行
firebase deploy完成部署后,进入Firebase控制台Hosting页面清除CDN缓存,避免旧缓存影响测试结果。
内容的提问来源于stack exchange,提问作者C. Ardayfio
相关产品推荐
相关产品推荐

