资讯专栏INFORMATION COLUMN

Nginx反向代理WebSocket响应403的解决办法

王伟廷 / 1022人阅读

摘要:在反向代理一个带有功能的程序源代码地址时,发现访问接口时总是出现响应,的配置参考的是官方文档相关配置唯一不同的是我们的配置了。

在Nginx反向代理一个带有WebSocket功能的Spring Web程序(源代码地址)时,发现访问WebSocket接口时总是出现403响应,Nginx的配置参考的是官方文档:

http {
    // ssl 相关配置 ...
    
    map $http_upgrade $connection_upgrade {
        default upgrade;
        "" close;
    }

    server {
        listen 8020;
        location /ws {
            proxy_pass http://some-ip:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

唯一不同的是我们的Nginx配置了https。

于是打开Spring日志查看直接访问和通过Nginx访问的差别。

直接访问的日志:

DEBUG ... o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name "dispatcherServlet" processing GET request for [/ws/gs-guide-websocket/786/kz0qai5l/websocket]
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /gs-guide-websocket/786/kz0qai5l/websocket
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/gs-guide-websocket/786/kz0qai5l/websocket]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Matching patterns for request [/gs-guide-websocket/786/kz0qai5l/websocket] are [/gs-guide-websocket/**]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : URI Template variables for request [/gs-guide-websocket/786/kz0qai5l/websocket] are {}
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Mapping [/gs-guide-websocket/786/kz0qai5l/websocket] to HandlerExecutionChain with handler [org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@307f6b8c] and 1 interceptor
DEBUG ... o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/ws/gs-guide-websocket/786/kz0qai5l/websocket] is: -1
DEBUG ... o.s.web.cors.DefaultCorsProcessor        : Skip CORS processing: request is from same origin
DEBUG ... o.s.w.s.s.t.h.DefaultSockJsService       : Processing transport request: GET http://localhost:8080/ws/gs-guide-websocket/786/kz0qai5l/websocket
DEBUG ... o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name "dispatcherServlet": assuming HandlerAdapter completed request handling
DEBUG ... o.s.web.servlet.DispatcherServlet        : Successfully completed request

通过Nginx访问的日志:

DEBUG ... o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name "dispatcherServlet" processing GET request for [/ws/gs-guide-websocket/297/jp1c3ab5/websocket]
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /gs-guide-websocket/297/jp1c3ab5/websocket
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/gs-guide-websocket/297/jp1c3ab5/websocket]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Matching patterns for request [/gs-guide-websocket/297/jp1c3ab5/websocket] are [/gs-guide-websocket/**]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : URI Template variables for request [/gs-guide-websocket/297/jp1c3ab5/websocket] are {}
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Mapping [/gs-guide-websocket/297/jp1c3ab5/websocket] to HandlerExecutionChain with handler [org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@307f6b8c] and 1 interceptor
DEBUG ... o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/ws/gs-guide-websocket/297/jp1c3ab5/websocket] is: -1
DEBUG ... o.s.w.s.s.t.h.DefaultSockJsService       : Processing transport request: GET http://localhost:8080/ws/gs-guide-websocket/297/jp1c3ab5/websocket
DEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor   : Handshake request rejected, Origin header value https://some-host.com not allowed
DEBUG ... o.s.w.s.s.s.HandshakeInterceptorChain    : org.springframework.web.socket.server.support.OriginHandshakeInterceptor@25ce6ad4 returns false from beforeHandshake - precluding handshake
DEBUG ... o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name "dispatcherServlet": assuming HandlerAdapter completed request handling
DEBUG ... o.s.web.servlet.DispatcherServlet        : Successfully completed request

注意到直接访问的日志里有这么一条:

DEBUG ... o.s.web.cors.DefaultCorsProcessor        : Skip CORS processing: request is from same origin

通过Nginx访问的日志里有这么一条:

DEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor   : Handshake request rejected, Origin header value https://some-host.com not allowed

然后Google查询相关解决办法,找到github上的这个issue,所以只需要修改Nginx的配置,添加proxy_set_header Origin "";就行了:

http {
    // ssl 相关配置 ...
    
    map $http_upgrade $connection_upgrade {
        default upgrade;
        "" close;
    }

    server {
        listen 8020;
        location /ws {
            proxy_pass http://some-ip:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Origin "";
        }
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39734.html

相关文章

  • Kubernetes首个严重安全漏洞发现者,谈发现过程及原理机制

    摘要:北美时间月日,爆出严重安全漏洞,该漏洞由联合创始人及首席架构师发现。反复深入研究后,我发现问题与不处理非响应和反向代理缓存连接有关。问题是,将仅在反向代理中执行许多请求的授权。大多数负载均衡器在看到升级请求而非响应后不会重用连接。 北美时间11月26日,Kubernetes爆出严重安全漏洞,该漏洞由Rancher Labs联合创始人及首席架构师Darren Shepherd发现。该漏洞...

    darkerXi 评论0 收藏0
  • 九种跨域方式实现原理(完整版)

    摘要:二跨域解决方案原理利用标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的数据。使用反向代理实现跨域,是最简单的跨域方式。 前言 前后端数据交互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。 本文完整的源代码请猛戳github博客,纸上得来终觉浅,建议动手敲敲代码 一、什么是跨域? 1.什么是同源策略及其限制内容? 同源策略是一种约定,它是浏览器最核心...

    edgardeng 评论0 收藏0
  • 九种跨域方式实现原理(完整版)

    摘要:二跨域解决方案原理利用标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的数据。使用反向代理实现跨域,是最简单的跨域方式。 前言 前后端数据交互经常会碰到请求跨域,什么是跨域,以及有哪几种跨域方式,这是本文要探讨的内容。 本文完整的源代码请猛戳github博客,纸上得来终觉浅,建议动手敲敲代码 一、什么是跨域? 1.什么是同源策略及其限制内容? 同源策略是一种约定,它是浏览器最核心...

    justCoding 评论0 收藏0
  • websocket pc端调试成功,手机端不可通信

    摘要:反向代理简单解释,用户访问页面,由转接,转到服务器端的内部开放端口不对外。 刚接触的一个涉及实时通信的h5项目,前期开发没遇到什么大问题,在pc端chrome调试都一切正常,用手机访问页面时,却出现了一个问题,node启动服务的命令行界面并没有打印出用户访问页面的信息,也就是说手机端的页面没有连接到websocket服务,且本地计算机和手机是连的是同一个wifi,也就是说网络环境相同,...

    lovXin 评论0 收藏0
  • websocket pc端调试成功,手机端不可通信

    摘要:反向代理简单解释,用户访问页面,由转接,转到服务器端的内部开放端口不对外。 刚接触的一个涉及实时通信的h5项目,前期开发没遇到什么大问题,在pc端chrome调试都一切正常,用手机访问页面时,却出现了一个问题,node启动服务的命令行界面并没有打印出用户访问页面的信息,也就是说手机端的页面没有连接到websocket服务,且本地计算机和手机是连的是同一个wifi,也就是说网络环境相同,...

    SunZhaopeng 评论0 收藏0

发表评论

0条评论

王伟廷

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<