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

React部署Heroku后HTTPS下向EC2后端发POST请求遇网络错误

问题分析与解决方案

你遇到的核心问题是浏览器的混合内容安全限制:当你的前端页面通过HTTPS(Heroku默认的访问方式)加载时,浏览器会阻止它向HTTP协议的后端(你的EC2服务器,用的是80端口的HTTP)发起请求。这是浏览器的安全策略,防止不安全的HTTP资源混入受HTTPS保护的页面上下文。

为什么localhost或HTTP访问Heroku时没问题?

因为这些场景下,页面本身是通过HTTP加载的,浏览器处于非安全上下文,不会触发混合内容的拦截规则,所以请求能正常发送到EC2的HTTP后端。

关于后端是否需要配置SSL的解答

是的,要让HTTPS前端能正常调用后端,你需要给EC2的Node.js/Express服务配置HTTPS(SSL证书)。不过针对你的课程项目场景,有几种低成本的解决方案:


方案1:给EC2后端配置HTTPS(推荐,符合安全规范)

你可以用免费的Let's Encrypt证书来配置HTTPS,有两种常用方式:

  1. 用Nginx反向代理(更稳定):
    在EC2上安装Nginx,配置SSL证书,把HTTPS请求转发到你的Express服务(比如本地端口3000)。
  2. 直接在Express中配置HTTPS:
    先获取Let's Encrypt的证书文件(fullchain.pem和privkey.pem),然后修改你的Express代码:
    const express = require('express');
    const https = require('https');
    const fs = require('fs');
    const cors = require('cors');
    
    const app = express();
    app.use(cors());
    // 其他中间件配置(bodyParser等)...
    
    // 加载证书文件
    const options = {
      key: fs.readFileSync('/path/to/privkey.pem'),
      cert: fs.readFileSync('/path/to/fullchain.pem')
    };
    
    // 创建HTTPS服务器
    https.createServer(options, app).listen(443, () => {
      console.log('HTTPS server running on port 443');
    });
    
    之后前端的请求要改成HTTPS协议,端口用443(默认HTTPS端口):
    axios.post('https://My-EC2-Instance-Here.compute.amazonaws.com/deflate/ascii', { inflatedAscii: valueAscii })
    

方案2:临时绕过混合内容限制(仅用于测试,不推荐长期使用)

如果只是课程项目临时测试用,可以让浏览器临时允许混合内容:

  • 在Chrome中,点击地址栏的锁图标 → 选择“不安全” → 点击“允许不安全内容”;
  • 注意:每次打开页面都需要重新设置,而且这会降低页面安全性,只适合短期测试。

方案3:把后端也部署到Heroku(更简单的课程项目方案)

Heroku的免费层支持Node.js应用部署,这样你的前后端都在Heroku上,都是HTTPS协议,不会有跨协议的问题。部署后,前端请求可以直接调用同域或Heroku提供的后端地址,彻底避免混合内容问题。


补充说明

你提到Wireshark看到TCP握手但无HTTP流量,这是因为浏览器在发起HTTP请求之前,就已经通过安全策略拦截了这个混合内容请求,所以握手完成后浏览器不会发送实际的HTTP请求,后端自然收不到。

内容的提问来源于stack exchange,提问作者jamomani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:18:14