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

开发环境启用HTTPS后WebSocket连接报错求助(React+Let's Encrypt)

解决React应用HTTPS启动时WebSocket的SecurityError问题

这个错误的核心原因很明确:你的页面是通过HTTPS加载的,但webpack-dev-server用于热重载的WebSocket还在尝试用不安全的ws://协议建立连接,浏览器出于安全策略禁止了这种混合内容的请求。下面给你几个针对性的解决办法:

方法1:强制WebSocket使用WSS协议

最简单的方式是通过环境变量让webpack-dev-server默认使用安全的WebSocket协议(wss),有两种实现方式:

  • 修改package.json里的start命令,直接追加环境变量:
    "start": "WDS_SOCKET_PROTOCOL=wss react-scripts start"
    
  • 或者在项目根目录创建.env.development文件(如果还没有的话),添加一行配置:
    WDS_SOCKET_PROTOCOL=wss
    
    这种方式更持久,不用每次修改package.json,重启应用后就会生效。

方法2:更安全地指定证书路径(替代手动合并到node_modules)

你当前的prestart命令是把证书合并到node_modules/webpack-dev-server/ssl/server.pem,但这个路径会因为依赖更新被覆盖,不是长久之计。可以直接通过环境变量告诉react-scripts你的证书位置:
修改package.json的start命令为:

"start": "SSL_CRT_FILE=/etc/letsencrypt/live/domainxxx/cert.pem SSL_KEY_FILE=/etc/letsencrypt/live/domainxxx/privkey.pem HTTPS=true react-scripts start"

这样就不需要prestart的合并步骤了,react-scripts会直接读取Let's Encrypt的证书文件,避免node_modules更新带来的问题。

方法3:验证配置是否生效

启动应用后,打开浏览器开发者工具的「Network」标签,在过滤栏选择「WS」,查看WebSocket的连接地址。如果显示wss://yourdomain/ws,说明配置成功;如果还是ws://,检查环境变量是否正确设置,或者有没有拼写错误。

如果以上方法都试过还是有问题,可以检查Let's Encrypt的证书是否包含完整的链(Let's Encrypt的cert.pem一般已经包含链,无需额外操作),或者确保服务器的防火墙/反向代理没有拦截WebSocket的请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:54