websocket + 代理请求失败,返回400

场景

业务服务提供了 websocket 服务,基于 websocket 来实现报表数据的推送,客户在浏览器上查看报表,经过 http 代理将请求传递给后端服务。

问题

客户在浏览器上查看报表数据时,报表功能异常,浏览器开发工具查看到 websocket 握手在服务端拒绝掉,返回 400 bad request。

分析

400 一般是由于客户端,所以应该是客户端请求参数或者路出现问题。通过对比正常和异常的websocket 请求报文,得到,异常的报文缺少了 Upgrade:websocket 的 http 头部。
Upgrade 属于 hop-to-hop 类型的 http cache ,与 end-to-end 不同,后者在两个客户端请求至最终后端服务时都不会变,如 User-Agent,而前者则会在经过代理时被处理掉,需要 proxy 的能力再将这类 hop-to-hop header 处理下。

解决方案

nginx 有如下解决方案,在 http 请求头里把 Upgrade 补上去,前提是在代理到后端之前的报文有 Upgrade。

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;

参考

关于Nginx+websocket 400问题 https://www.jianshu.com/p/d5b136a27bdf
End-to-end and Hop-by-hop Headers https://tools.ietf.org/html/rfc2616#section-13.5.1

原文地址:https://www.cnblogs.com/haoqingchuan/p/9567082.html

时间: 2024-10-04 03:15:29

websocket + 代理请求失败,返回400的相关文章

WebSocket api与服务器返回的数据类型判断(文件、二进制数据)

一.为什么需要 WebSocket? 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起. 举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果.HTTP 协议做不到服务器主动向客户端推送信息. 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.我们只能使用"轮询":每隔一段时候,就发出一个

JQuery请求WebService返回数据的几种处理方式

打开自己的博客仔细浏览了一番,发现已经好久没有写博客了,由于最近一直比较忙碌懈怠了好多.默默反省三分钟.......言归正传,现在就对最近在学习webservice的过程中遇到的几种类型的问题中我的理解和解决方案.对于webservice大家肯定知道,它是一种使不同站点之间可以相互通信的技术,可以理解为一种接口.一个站点可以通过其它站点提供的webservice接口获得其它站点提供的相应服务.webservice使用起来非常小巧,轻便被很多站点所使用.对于webservice我不做过多说明,we

修改请求和返回报文

一.Charles中修改请求.修改返回值 1. 找到要修改的请求, 设置断点 2.修改请求信息 3.修改返回信息,并重新发送 注意: 1.在手机上抓的包也可以通过上述方法进行修改请求和返回的报文. 2.https都是加密的,需要有证书的才可以抓包,http或者bbs的--一般的证书是以.cret结尾的文件双击就可以装证书 3.通过抓包,可以分析和定位问题 4.URL转码--浏览器对特殊字符处理时,就自己定义了比如%20=空格,以%开头正常的 二.Fiddler抓取请求 Fidder抓请求和cha

关于ajax请求,返回json数据格式

使用servlet测试 后台数据为:返回类型没有设置(方式一) 1 String str = "["+ 2 "{ id:1, pId:0, name:\"可折腾的父节点 1\", t:\"我很普通,随便 展开/折叠 我吧\", open:false},"+ 3 "{ id:11, pId:1, name:\"叶子节点 - 1\", t:\"我老爸很普通,随便折腾他吧\"},&q

Spring MVC 中 AJAX请求并返回JSON

一.以ModelAndView的方式返回 先看下JavaScript代码: 1 /** 2 * 保存-同步(版本控制库) 3 */ 4 function saveSynchronizedVcHorse(obj) { 5 var ss = $("#SynchronizedSelection div"); 6 var cacheSelectAry = new Array() 7 for(var i = 0; i < ss.length; i ++) { 8 //alert(ss.eq

spring项目如何统计所有请求的返回码--项目安全防刷统计

最近遇到个问题,一个简单的spring mvc的项目,但是经常被刷子刷,恶意暴力破解通信协议,不断尝试登陆系统,为了方便实时统计请求量和请求返回码的分布情况.最简单的逻辑:不断有人错误登陆,当次数多了,说明有问题了,有人在恶意刷我们的系统. 那么这个问题的一个重要环节就是统计所有请求的返回码,方便离线大数据的同学分析,怎么记录返回码呢?总不能每次都定义一个log,在每个return里进行log.info吧. returnMap.put("result", "500"

Ajax请求ashx 返回 json 格式数据常见问题

问题:ashx 返回的字符串json格式,在前台ajax自动解析失败. 问题分析:经过排查,发现是拼接json时出现” ’  “单引号,jquery无法解析,用” “ “双引号才可以.例如: string strjson="[ { 'userName':'test'}]"; //单引号导致jquery无法自动解析. string strjson="[ {\"userName\":\"test\"}]"; // 双引号可以解析:

post提交参数有Date类型,总是返回400格式错误

post提交参数有addtime时,总是返回400错误. 将参数改为addTime时,就能正常提交了. 尝试了各种方法,纠结了好久还是没搞定,之前猜测试addtime是关键字导致的不能提交,后来测试,addtime是可以提交的. 经过不断尝试终于找到了原因:spring mvc 在接收日期类型参数时,如不做特殊处理 会出现400语法格式错误 解决办法: 我们在SpringMVC开发中,可能遇到比较多的问题就是前台与后台实体类之间日期转换处理的问题了,说问题也不大,但很多人开发中经常会遇到这个问题

模拟登陆知乎,返回400

模拟登陆知乎后,跳转到首页,返回400,请求无效,应该是知乎对request请求有做要求. 看了下请求头,主要关注cookie.referer和user_agent(不要问为什么,我看视频的),cookie在scrapy.Request里有单独参数.不管怎样,先测试下: # -*- coding: utf-8 -*- import scrapy,os,re from scrapy.http import Request from mouse import move class ZhihuSpid