Cloudflare灵活SSL下WebSocket握手错误525及连接问题求助
解决Cloudflare Flexible SSL模式下WebSocket连接失败(525错误+CORS问题)
这问题我之前帮朋友排查过类似的,Flexible SSL模式下WebSocket踩坑确实挺常见的,咱们一步步拆解问题、解决问题:
先搞懂为啥会出这些错
- CORS错误:因为你的前端是HTTPS(通过Cloudflare),而源服务器是HTTP,浏览器会触发跨域检查,服务器没返回正确的
Access-Control-Allow-Origin头就会报错。 - 525错误:这个是Cloudflare和你的源服务器之间的连接握手失败,但Flexible模式下Cloudflare是用HTTP连接源服务器的,所以本质是你的源服务器没正确响应Cloudflare的WebSocket升级请求,或者防火墙/配置拦截了请求。
一步一步解决
1. 先确认源服务器的WebSocket本身能正常工作
先绕开Cloudflare,直接测试源服务器的WebSocket:
- 用工具(比如wscat)执行命令:
wscat -c ws://你的源服务器IP:80/你的WebSocket路径 - 如果连接失败,说明问题出在服务器本身,先把服务器的WebSocket服务调通——比如确认服务在监听80端口(或对应HTTP端口),没有被防火墙拦截。
2. 修正服务器的WebSocket配置(以Nginx为例)
如果用Nginx反向代理WebSocket,必须添加WebSocket升级的头配置,同时处理CORS:
server { listen 80; server_name 你的域名; location /你的WebSocket路径 { # 转发到本地的WebSocket服务端口 proxy_pass http://localhost:你的WebSocket服务端口; # 关键:支持WebSocket协议升级 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 传递必要的请求头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 解决CORS问题 add_header Access-Control-Allow-Origin *; # 生产环境建议指定你的域名,比如https://your-domain.com add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Upgrade, Connection, Origin"; } }
如果是Apache,也要对应配置mod_proxy_wstunnel模块,添加类似的升级头和CORS设置。
3. 调整客户端的WebSocket配置
你现有的connectionOptions可以微调一下,确保和Flexible模式匹配:
var connectionOptions = { "force new connection": true, "reconnectionAttempts": "Infinity", "timeout": 10000, "transports": ["websocket"], "secure": true, // 客户端是和Cloudflare的HTTPS连接,所以设为true "rejectUnauthorized": false // 如果你的源服务器没有SSL证书(Flexible模式不需要),可以加这个避免验证错误 };
注意:客户端要使用wss://你的域名/你的WebSocket路径来连接,不要直接用源服务器的IP或HTTP地址。
4. 检查Cloudflare的后台配置
- 确认Network选项里的「WebSocket支持」是开启状态(默认是开的,但最好检查一下)。
- 检查Page Rules,有没有针对WebSocket路径的缓存或重写规则——WebSocket请求不能被缓存,所以如果有缓存规则,要排除你的WebSocket路径。
- 确认Cloudflare的IP段没有被你的服务器防火墙拦截(把Cloudflare官方IP列表加入服务器防火墙的白名单)。
最后再验证
配置完之后,先重启服务器的Web服务(Nginx/Apache)和WebSocket服务,然后用前端页面测试连接:
- 如果还是有问题,打开浏览器的开发者工具,看Network里的WebSocket请求,查看请求头和响应头,确认
Upgrade和Connection头是否正确传递,CORS头是否存在。 - 也可以在Cloudflare的「Analytics」->「Traffic」里查看请求的状态码,确认是不是服务器那边的问题。
内容的提问来源于stack exchange,提问作者16austin16
相关产品推荐
相关产品推荐

