Mixed content blocked问题求助:Vercel部署应用访问GCP托管Node.js API的HTTPS/SSL配置异常
解决Mixed Content Blocked及API SSL错误问题
看起来你已经精准定位了核心问题——部署在Vercel的前端是HTTPS环境,调用HTTP协议的API触发了浏览器的混合内容拦截机制。现在要解决的就是把API切换到HTTPS,同时搞定Postman里的SSL报错,我一步步给你梳理方案:
一、先明白:Postman的SSL错误为啥会出现?
你当前的Node.js代码只是用app.listen()启动了纯HTTP服务,完全没配置SSL证书来支持HTTPS。所以当你用HTTPS前缀请求时,服务器没法提供有效的SSL证书验证,自然会触发SSL错误。
下面分两种GCP常见部署场景给出解决方案:
场景1:用GCP负载均衡做SSL终止(推荐,无需修改Node.js代码)
这种方式让GCP负载均衡器处理HTTPS的证书加密逻辑,你的API内部仍用HTTP运行,是生产环境最省心的方案:
- 在GCP控制台创建托管SSL证书:绑定你的API域名,GCP会自动向Let's Encrypt申请免费可信证书,等待几分钟直到证书颁发成功。
- 配置负载均衡器:
- 创建HTTPS类型的负载均衡,监听443端口(HTTPS默认端口)。
- 将后端服务指向你的API实例,设置端口映射为
443 -> 8080(负载均衡接收HTTPS请求,转成HTTP转发给你的API)。
- 确保GCP防火墙规则允许443端口的入站流量。
- 完成后,用负载分配的HTTPS域名访问API,Postman不会再报SSL错误,前端调用这个HTTPS地址就能彻底解决混合内容拦截问题。
场景2:直接在Node.js代码中启用HTTPS
如果不想用负载均衡,也可以让Node.js服务直接提供HTTPS:
- 获取可信SSL证书:可以用Let's Encrypt免费证书,或者GCP颁发的证书,把证书文件(私钥
*.key/证书*.pem)上传到GCP服务器。
- 获取可信SSL证书:可以用Let's Encrypt免费证书,或者GCP颁发的证书,把证书文件(私钥
- 修改API代码,改用
https.createServer()启动服务:
- 修改API代码,改用
const https = require('https'); const fs = require('fs'); const app = require("./app"); require("dotenv").config(); // 替换成你的证书文件实际路径 const sslOptions = { key: fs.readFileSync('/path/to/your-private-key.key'), cert: fs.readFileSync('/path/to/your-certificate.pem') }; // HTTPS默认用443端口,非root用户可以用8443(记得在防火墙开放对应端口) const port = process.env.PORT || 443; https.createServer(sslOptions, app).listen(port, () => { console.log(`HTTPS server running on port ${port}`); });
- 在GCP防火墙中开放对应的HTTPS端口(443或8443)。
- 现在用HTTPS访问你的API服务器IP/域名,Postman就能正常请求,前端也可以安全调用了。
二、额外注意事项
- 如果测试时用自签名证书,Postman需要临时关闭「SSL certificate verification」(设置->General里),但生产环境一定要用可信证书,否则浏览器还是会拦截请求。
- 前端代码里所有API请求的前缀都要改成HTTPS,不能再留HTTP的地址。
- 要是你是用Cloud Run部署API,那Cloud Run默认会提供HTTPS访问,只需要确保容器端口设置为8080,直接用Cloud Run分配的HTTPS域名即可,完全不需要自己配置SSL!
内容的提问来源于stack exchange,提问作者user15608655
相关产品推荐
相关产品推荐

