Firebase重写规则配置问题:API路由被映射到SPA首页
嘿,我来帮你搞定这个问题!你的配置思路其实是对的,但大概率是某个细节没处理好,才导致/api路由被误指向了SPA的index.html。让我给你拆解一下问题和解决方案:
首先,Firebase的重写规则是按顺序匹配的——从上到下检查,第一个匹配到请求路径的规则会生效。你现在把/api/**的规则放在最前面,逻辑上是没问题的,理论上所有/api开头的请求都应该被路由到你的Express函数,而不是落到后面的SPA规则。如果没生效,可能是下面几个原因:
检查通配符写法与请求路径的匹配
Firebase的source字段支持*(匹配单个路径段)和**(匹配所有后续路径段),/api/**的写法是正确的,比如/api/users/123、/api/posts这类请求都应该被匹配到。但要注意,请求路径不能带多余的斜杠(比如/api//users),这种可能会匹配失败。确认Express函数的路由处理逻辑
很多人在这里踩坑:如果你的Express函数里已经给路由加了/api前缀,那Firebase重写过来的请求会变成/api/api/xxx,自然找不到对应的路由。举个正确的写法示例:const express = require('express'); const functions = require('firebase-functions'); const app = express(); // 用Router来处理/api后面的路径,避免重复前缀 const apiRouter = express.Router(); apiRouter.get('/users', (req, res) => { res.json({ message: 'User list' }); }); // 把Router挂载到/api路径,这样Firebase过来的/api/xxx就会被正确处理 app.use('/api', apiRouter); exports.api = functions.https.onRequest(app);如果你不想在函数里加
/api前缀,也可以把重写规则的source改成/api/{*path},这样函数里直接处理/users就能响应/api/users的请求。重新部署Hosting和Functions
有时候只部署了Hosting或者只部署了Functions,会导致规则和函数没有关联起来。一定要用这个命令同时部署两者:firebase deploy --only hosting,functions给SPA规则加上排除项(可选但更保险)
虽然按顺序匹配应该不会有问题,但可以给第二个规则加上exclude字段,明确排除/api开头的路径,避免意外匹配:"rewrites": [ { "source": "/api/**", "function": "api" }, { "source": "**", "destination": "/index.html", "exclude": ["/api/**"] } ]
总的来说,你的初始配置方案是可行的,只要排查上面几个细节点,就能解决API路由被SPA接管的问题。
内容的提问来源于stack exchange,提问作者leros

