websocket 中 request-line 中的URI编码问题

首先,request-line组成如下:

Request-Line = Method SP Request-URI SP HTTP-Version CRLF

在 rfc6455 规范的 5.1.2 Request-URI 中,有这样的描述:

The Request-URI is transmitted in the format specified in section 3.2.1. If the Request-URI is encoded using the "% HEX HEX" encoding [42], the origin server MUST decode the Request-URI in order to properly interpret the request. Servers SHOULD respond to invalid Request-URIs with an appropriate status code.

规范中明确说了如果请求URI使用"%HEX-HEX"编码方式,服务器要能正确解码URI,其潜在的含义是,请求头中的URI可能编码,也可能不编码,因此在解析请求头的时候,必须对此做出判断。

但是,在我之前做 nginx 1.24 websocket 反向代理的时候,发现我的请求始终无法通过 nginx 到达服务器,nginx会直接给我报错 400,开始的时候我非常不解,改了很多次nginx的配置也无法解决问题,后来想到了一个办法,将nginx的日志级别开到debug,然后再实验的时候,发现nginx 日志里面输出了一条记录

client sent invalid request while reading client request line, client: 192.168.0.1, server: , request: "GET %2F%2Ftest HTTP/1.1"

终于将问题定位到了请求行,我发现这个请求头和用浏览器唯一的区别就是URI的编码。于是,我将URI编码取消 ,再次发送请求,这次终于成功通过了nginx的反向代理。

对此,我只能说,虽然规范规定了可以用URI编码,但是实际上,很多软件并没有重视这个问题。

相关推荐
GDAL22 分钟前
NJS 共享字典(ngx.shared)全解析:跨 Worker 进程的数据共享方案
nginx·shared·njs
xifangge202525 分钟前
PHP 错误日志在哪里看?Apache / Nginx / PHP-FPM 一次讲清
nginx·php·apache
*才华有限公司*26 分钟前
RTSP视频流播放系统
java·git·websocket·网络协议·信息与通信
鸠摩智首席音效师35 分钟前
如何安装和配置 Nginx 反向代理服务器 ?
运维·nginx
栗子叶2 小时前
网页接收服务端消息的几种方式
前端·websocket·http·通信
星光不问赶路人3 小时前
Nginx 的 location 路径匹配语法详解
nginx·api
GDAL3 小时前
深入理解 NJS 全局对象:掌控运行时的核心工具
nginx·njs
GDAL5 小时前
精通 NJS HTTP 请求对象:全方位掌控 NGINX 请求生命周期
nginx·njs
飞翔沫沫情5 小时前
Nginx运维维护规范及全配置详解【持续更新】
nginx·nginx 配置·nginx 操作手册·nginx 使用规范·nginx 日志规范·nginx 配置文件说明
栗子叶5 小时前
SSE、长轮询与 WebSocket 连接资源对比及 Spring Boot 配置指南
spring boot·websocket·网络协议