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


     

    本篇文章主要介绍了详解Nginx反向代理WebSocket响应403的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    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访问的差别。

    直接访问的日志:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    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访问的日志:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    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 ""; 就行了:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    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 "";

        }

      }

    }

  • 相关阅读:
    webapp开发绝对定位引发的问题
    git下配置github sshkey
    html5 filereader读取流注意事项
    神奇的负Margin
    泪奔的ie
    第二次作业-实践一 网络攻防环境的搭建
    20199115 2019-2020-2 《网络攻防实践》第一周作业
    《网络攻防实践》寒假作业
    C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    getline()函数
  • 原文地址:https://www.cnblogs.com/wjlbk/p/12633326.html
Copyright © 2020-2023  润新知