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

WebSocket连接持续返回403错误求助(Gin+Gorilla+AWS部署)

Gin+Gorilla WebSocket部署AWS后/ws接口返回403排查方案

问题背景

用Gin框架搭配Gorilla WebSocket开发的服务,部署到AWS之后,浏览器连接/ws接口持续返回403错误。代码中未编写任何返回403的逻辑,也未添加相关中间件,请求日志显示:

[GIN] 2023/05/07 - 22:18:49 | 403 |      18.344µs |  71.121.188.229 | GET      "/ws"

相关服务代码如下:

func WebsocketServer(w http.ResponseWriter, r *http.Request, context *gin.Context) {
    fmt.Println("connection received")
    var upgrader2 = websocket.Upgrader{
        CheckOrigin: func(r *http.Request) bool {
            return true
        },
        EnableCompression: false,
    }
    db, err := aws.GetDB()
    if err != nil {
        helpers.Log.Println(err)
        return
    }
    defer db.Close()
    c, err := upgrader2.Upgrade(w, r, nil)
    if err != nil {
        helpers.Log.Println(err)
        return
    }

}
func PublicRoutes(c *gin.RouterGroup) {
    c.GET("/ws", func(c *gin.Context) {
        relay.WebsocketServer(c.Writer, c.Request, c)
    })
}

部署层面排查方向

  • AWS WAF拦截:检查AWS WAF规则配置,确认是否存在阻止/ws路径请求的规则,或是针对WebSocket握手的防护规则误触发了拦截。
  • 负载均衡器配置:如果使用了ALB/NLB,需确认是否开启WebSocket支持——ALB要在监听器中启用WebSocket协议,同时检查目标组的健康检查配置是否会误拦截请求;另外要确保负载均衡器的安全组允许客户端与服务端的80/443端口通信。
  • 安全组与网络ACL:检查EC2实例的安全组是否放开了客户端入站的80/443端口,网络ACL也要确保放行相关TCP流量,包括WebSocket握手后的长连接。
  • API Gateway配置:如果使用了API Gateway,必须确认是配置了WebSocket API而非普通REST API——普通REST API默认不支持WebSocket握手,会直接返回403。
  • HTTPS与Origin校验:虽然代码中CheckOrigin返回true,但如果AWS服务强制HTTPS,客户端用HTTP请求可能触发403;或是AWS某些组件额外做了Origin校验,可尝试用HTTPS连接/ws接口测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:10:27