如何让Firebase托管的HTTPS React应用连接EC2上的HTTP Express API?
解决方案
1. 为EC2上的Express配置CA签名SSL证书(最直接方案)
浏览器拒绝自签证书是因为不信任颁发机构,用Let's Encrypt可以免费获取可信CA签发的证书:
- 在EC2服务器安装Certbot(以Ubuntu为例:
sudo apt update && sudo apt install certbot) - 确保域名已解析到EC2公网IP,运行命令获取证书:
sudo certbot certonly --standalone -d your-domain.com - 在Express中配置HTTPS服务:
const https = require('https'); const fs = require('fs'); const express = require('express'); const cors = require('cors'); const app = express(); // 配置CORS,允许你的Firebase托管域名 app.use(cors({ origin: 'https://your-firebase-app.web.app' })); // 你的API路由 app.get('/api/test', (req, res) => { res.json({ status: 'success', data: 'Hello from HTTPS API' }); }); // 加载Let's Encrypt证书文件 const sslOptions = { key: fs.readFileSync('/etc/letsencrypt/live/your-domain.com/privkey.pem'), cert: fs.readFileSync('/etc/letsencrypt/live/your-domain.com/fullchain.pem') }; // 启动HTTPS服务器 https.createServer(sslOptions, app).listen(443, () => { console.log('HTTPS API running on port 443'); });
- 记得在EC2安全组开放443端口的入站访问
2. 使用AWS应用负载均衡器(ALB)代理SSL请求
如果不想修改Express代码,可以用ALB处理HTTPS终结:
- 在AWS证书管理器(ACM)申请免费SSL证书(绑定你的域名,需要域名验证)
- 创建应用负载均衡器,配置HTTPS监听(443端口)并关联ACM证书
- 创建目标组,将EC2实例的HTTP端口(如3000)加入目标组
- 配置ALB转发规则,把HTTPS请求转发到目标组的HTTP端口
- React直接调用ALB的HTTPS域名,同时在Express中配置CORS允许该域名
3. 用Firebase Functions做中间代理层
利用Firebase Functions的HTTPS能力做代理,避免混合内容问题:
- 在Firebase项目中创建Cloud Function,示例代码:
const functions = require("firebase-functions"); const axios = require("axios"); exports.proxyApi = functions.https.onRequest(async (req, res) => { try { // 转发请求到EC2的HTTP API const targetUrl = `http://your-ec2-ip:3000${req.path}`; const response = await axios({ method: req.method, url: targetUrl, data: req.body, headers: { ...req.headers, host: undefined } // 避免host头冲突 }); res.status(response.status).send(response.data); } catch (err) { res.status(err.response?.status || 500).send(err.message); } });
- 部署Function后,React调用
https://your-firebase-project.cloudfunctions.net/proxyApi/your-endpoint - 确保EC2安全组允许Firebase Functions的IP段访问(或直接开放对应HTTP端口给公网,根据需求)
内容的提问来源于stack exchange,提问作者wnba_youngboy
相关产品推荐
相关产品推荐

