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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:19:07