http状态码(一)400报错

400报错汇总

① 综述

bash 复制代码
一、4xx状态码报错

 说明: '客户端'行为导致的'报错'

二、通用的'4xx'HTTP报错

  1) 400

  2) 401

  3) 403

  4) 404

  5) 405  --> 不允许方法,可能'跨域'或者'nginx限制'请求方法

  6) 408

  7) 413

  8) 419

三、ngin自身定义的'4xx'报错

  495、496、497、498、'499'

  在src/http/ngx_http_special_response.c文件中有'状态码'的解释

HTTP 400的语义

bash 复制代码
关注: 'http的语义',以及 'ninx 对 http的实现' 的实践程度
bash 复制代码
说明: 虽然我们无法'去穷举'所有可能出现的'不合规'类型,但是一些常见的类型必须'熟知'

③ 思考

bash 复制代码
思考1: debug 能观察 'http 400' 报错的原因吗?

思考2: HTTP 400 报错,是'nginx'代理返回的? 还是'后端服务器'返回的?

  备注: 通过'$upstream_status'和'$upstream_addr'综合判断
  
  说明: 如果nginx 直接返回'400'报错,就不会转发到'上游'服务器

原因: nginx认为客户端'请求语法'错误,导致'无法理解'请求信息,进而服务器'无法处理'请求

④ nginx常见400报错

bash 复制代码
明确: 400 究竟是'谁返回'的? 'nginx代理'还是'后端'  --> 看'$upstream_status'是否有值
bash 复制代码
1、Request Heder '请求头' 过大

  场景1: 某个'域名'下可能积累大量的cookie,导致'Cookie'请求头过大

  场景2: 请求头携带'特殊字符'导致报错

  场景3: 后端响应头返回'异常'信息

  阶段:解析请求头的时候-->'两个反向'(client->nginx;upstream-->nginx)

Cookie过大导致request 400

bash 复制代码
2、证书'校验'失败

  场景:一般是nginx配置双向认证,nginx校验客户端证书,客户端'没提供'证书或者'客户端证书'过期

  细节点:'error.log debug' 中报了SSL握手失败

  报错1: No required SSL certificate was sent

  报错2: client SSL certificate verify error: \

      (21:unable to verify the first certificate) \

      while reading client request header

upstream 模块细节 nginx upstream 中带下划线bug 前端会报400错误 sping导致400

bash 复制代码
3、Invalid hostname '无效的主机头'

场景1:

  1) 由于nginx在转发的时候使用了'默认'的 proxy_set Host $proxy_host

  2) 传递过去的是'upstream_id',导致tomcat'无法解析'主机头 

场景2:HTTP1.1,但是Host头为'空'

模拟: curl -I -H 'Host:' nginx.wzj.com
bash 复制代码
4、HTTP协议

客户端报错: '400 Bad Request: The plain HTTP request was sent to HTTPS port'

error.log报错: client sent plain HTTP request to HTTPS port \

   while reading client request header

需求: 配置文件将让Nginx侦听'80和443'端口,并将所有的'HTTP请求'重定向到HTTPS

  尝试: http://www.wzj.com  --> '报错'

listen 80;
listen 443;
ssl on;

++++++++++ "分割线" ++++++++++

listen 80;
listen 443 ssl;

原因分析:

 1)因为HTTP请求被发送到'HTTPS端口'

 2) 这种报错多出现在Nginx'既处理HTTP请求'又'处理HTTPS请求'的+是'多次重定向导致'的情况

遗留: proxy_set_header X-Forwarded-Proto https;

协议问题 Nginx "The plain HTTP request was sent to HTTPS port" 案例分析

URI过长或request header过大导致400或414报错

bash 复制代码
5、 其它'HTTP'请求'不规范'的场景

场景1: query的参数'有空格',未经过'unlencode'编码

curl -v 'http://127.0.0.1/log?name=wzj&channel=Google Play' -d @test.json

场景2: HTTP头'不规范'

Authorization: <auth-scheme> <authorization-parameters>  

场景3: content_length和body长度'不一致'
bash 复制代码
+++++++++++++++++++  '原因'分析  +++++++++++++++++++

Authorization不规范导致400

⑤ nginx是如何解析http

HTTP的请求消息格式

bash 复制代码
HTTP 规定,'头部'和'载荷'的分界线是'两次 CRLF'

⑥ 遗留

nginx http 499 其实没有很可怕

nginx 自身 495 496 497 状态码 参考出处

nginx踩坑系列之从http跳转到https

nginx的499状态码是怎么回事?

相关推荐
轻口味1 小时前
【每日学点鸿蒙知识】Web请求支持Http、PDF展示、APP上架应用搜索问题、APP备案不通过问题、滚动列表问题
前端·http·harmonyos
Liveweb视频汇聚平台2 小时前
FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
服务器·http·ffmpeg
涔溪2 小时前
如何在Express.js中定义多个HTTP方法?
javascript·http·express
yqcoder3 小时前
HTTP 协议规定的协议头和请求头
网络·网络协议·http
码飞_CC9 小时前
html文件通过script标签引入外部js文件,但没正确加载的原因
前端·javascript·http·https·html·安全策略
阿泽不想掉光头发10 小时前
C#实现调用DLL 套壳读卡程序(桌面程序开发)
java·开发语言·后端·websocket·http·c#
w_outlier13 小时前
cookie__HTTPS
c++·网络协议·http·https
散一世繁华,颠半世琉璃16 小时前
SpringBoot揭秘:URL与HTTP方法如何定位到Controller
spring boot·后端·http
DashVector1 天前
如何通过HTTP API插入Doc
数据库·人工智能·http·阿里云·向量检索
DashVector1 天前
如何通过HTTP API分组检索Doc
服务器·数据库·http·数据库开发·数据库架构