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编码,但是实际上,很多软件并没有重视这个问题。

相关推荐
枫叶轻语16 小时前
【Nginx 从入门到实战 07】root 与 alias:资源路径到底怎样对应?
nginx·全栈
acd1200919 小时前
Nginx 反向代理的缓冲区坑:后端响应大时接口偶发 502
java·运维·nginx
Thanks_ks20 小时前
常见 HTTP 状态码的坑:301/302、401/403、500/502 之间差的那一个词
计算机网络·nginx·http·面试·状态码·后端开发·浏览器缓存
QianhangQianping21 小时前
WebSocket实时推送+ HTTP 定时轮询:一块大屏两套取数怎么不打架
前端·websocket·网络协议·http·低代码·架构·数据可视化
Lsetea2 天前
Certbot webroot申请SSL证书总是404:Nginx挑战目录与路径映射检查
运维·nginx·https·ssl证书·certbot
莫晓燚2 天前
双机部署若依 (RuoYi‑Vue) 传统环境部署---实战
linux·运维·数据库·redis·mysql·nginx·ruoyi
web打印社区2 天前
Lodop排障总纲-常见报错一张表
开发语言·前端·javascript·chrome·websocket
山乐191312 天前
麒麟系统,安装Nginx并配置https证书
运维·nginx·https
一直在努力学习的菜鸟2 天前
阿里云SSL证书到期更换指南(Nginx + Typecho)
nginx
雾时之林2 天前
Nginx反向代理与proxy_cache缓存搭建CDN服务器
服务器·nginx·缓存