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

React调用Express API出现混合内容错误的解决方法咨询

解决混合内容错误的具体方案

首先先纠正你可能的笔误:你提到Postman访问的地址是https://my-id-adress:300/hi,应该是3000端口吧?以下方案基于这个前提展开。

1. 检查API请求的URL协议

先确认React项目里的API调用代码,必须用https开头的URL,绝对不能用http——因为Vercel部署的页面默认是HTTPS环境,调用HTTP接口会直接触发混合内容拦截。

示例代码:

// 错误写法(会触发报错)
fetch('http://my-id-address:3000/hi')

// 正确写法
fetch('https://my-id-address:3000/hi')

如果已经用了HTTPS还是报错,那问题出在你的Express服务器HTTPS配置上。

2. 给Express服务器配置有效SSL证书

Postman对证书问题容忍度高,但浏览器会严格校验HTTPS证书的合法性。你需要给Droplet上的Express配置正规SSL证书(比如Let's Encrypt的免费证书),不能用自签名证书(浏览器会标记为不安全资源)。

具体步骤:

  • 安装Certbot工具获取证书:
    sudo apt update
    sudo apt install certbot
    
  • 为服务器IP申请证书(如果有域名更推荐用域名,无域名则用IP):
    sudo certbot certonly --standalone -d 你的服务器IP
    
  • 修改Express代码,改用HTTPS服务并加载证书:
    const express = require('express');
    const https = require('https');
    const fs = require('fs');
    const app = express();
    
    // 证书路径根据Certbot的实际输出调整
    const sslOptions = {
      key: fs.readFileSync('/etc/letsencrypt/live/你的服务器IP/privkey.pem'),
      cert: fs.readFileSync('/etc/letsencrypt/live/你的服务器IP/fullchain.pem')
    };
    
    app.get('/hi', (req, res) => {
      res.send('Hello from Express!');
    });
    
    // 用https.createServer替代原来的http.createServer
    https.createServer(sslOptions, app).listen(3000, () => {
      console.log('HTTPS server running on port 3000');
    });
    

3. 用Nginx做反向代理(更推荐的生产方案)

如果不想直接修改Express代码,也可以用Nginx处理HTTPS请求,再转发到Express的3000端口,这样后续维护更灵活。

具体步骤:

  • 安装Nginx:
    sudo apt install nginx
    
  • 创建Nginx配置文件/etc/nginx/sites-available/express-proxy:
    server {
        listen 443 ssl;
        server_name 你的服务器IP;
    
        ssl_certificate /etc/letsencrypt/live/你的服务器IP/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/你的服务器IP/privkey.pem;
    
        location / {
            proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
    
    # 把HTTP请求自动重定向到HTTPS
    server {
        listen 80;
        server_name 你的服务器IP;
        return 301 https://$host$request_uri;
    }
    
  • 启用配置并重启Nginx:
    sudo ln -s /etc/nginx/sites-available/express-proxy /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl restart nginx
    
    之后React项目里直接用https://你的服务器IP/hi调用接口即可,不用再加3000端口。

4. 临时测试方案(仅开发用,禁止生产)

如果只是本地开发测试,可以在Chrome浏览器里临时允许该Vercel页面加载不安全内容:

  • 打开Chrome设置,搜索「不安全内容」
  • 在「允许显示不安全内容」选项中,添加你的Vercel项目域名(比如https://你的项目名.vercel.app)
    但这个方法只能临时用,生产环境必须用正规HTTPS配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:07:14