nginx(六十一)proxy模块(二)修改发往上游的请求

news2024/11/18 15:31:44

一  修改发往上游的请求

重点: 利用指令'更改'转发给上游服务器的'HTTP报文'的内容
 
1) 请求'行' --> 'proxy_method'、'url'、'proxy_http_version'
 
2)请求'头' --> 'proxy_set_header'、'proxy_pass_request_headers'
 
3)请求'体' --> 'proxy_pass_request_body'、'proxy_set_body'

思考: 有'哪些'指令?

(1)生成发往上游的请求行

①  proxy_method

场景: 上游服务器可能'不支持'某些请求方法,需要nginx进行'转换'下

② 关于最终发往上游的url参见  

③ proxy_http_version

1)  http1.0'不支持'长连接
 
2)  http1.0 短连接'有'大量的TIME_WAIT'

upstream sent invalid chunked response while reading upstream 

Transfer-encoding   chunked  分块编码传输

(2)生成发往上游的请求头

①  proxy_set_header 

1)基本描述

proxy_set_header 就是'设置请求头',并将头信息'传递'到'后端服务器';
 
重点:'子域'要么'全部继承',要么'全部覆盖'
 
场景: 允许'修改'、'新增'、'删除'转发给'上游'请求头

2)官方解读 

说明: nginx默认会修改'Host'头,很显然'不符合'我们的要求

注意: proxy_set_header有'上下文',会'覆盖'父作用域的'proxy_set_header'

补充: 经常出现'proxy_set_header'作用域覆盖,导致'不生效'的场景

3)请求头的问题

proxy_set_header Host  $http_host;  
 
1)如果客户端请求头中没有携带'Host'这个头部,那么传递到后端服务器的请求也'不含'这个头部
 
proxy_set_header Host  $host;
 
2) 这种情况下,'更好的方式'是使用'$host变量'
 
特点:它的值在'请求包含Host请求头'时为"Host"字段的值;在请求"未携带Host请求"时为虚拟主机的'server_name'
 
说明:一般用'$host'代替'$http_host'变量,避免http请求中在'丢失Host'头的情况下,Host不被重写的失误

 4)长连接

 proxy_http_version 1.1;
 
 proxy_set_header Connection "";  -->"等价" proxy_set_header Connection "keepalive"
 
 特点: HTTP1.1'默认(不传递Connection)'就是'长'连接

 5)长连接的应用

nginx支持websocket配置

1)  nginx 'websocket配置' 配置
 
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
 
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

2)chunk'分块'传输

6)最佳实践

proxy_set_header Host  $host:$server_port;  # '重写'请求头
 
proxy_set_header X-Real-IP $remote_addr;    # '添加新请求头'
 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # '添加新请求头'
 
备注: $proxy_add_x_forwarded_for = $http_x_forwarded_for, $remote_addr

proxy_set_header权威参考

注意事项  

②  proxy_pass_request_headers

proxy_pass_request_headers off与ngx.req.set_header结合的坑

proxy_force_ranges应用场景 

③  ignore_invalid_headers

说明: nginx 默认'识别' 请求header filed为'英文字母、数字、连接符',这些是'有效'的

备注: 这个是'nginx'在处理原始'请求头'阶段,不是'content'阶段的'proxy'模块指令

补充: 放到这里是因为也是'请求头'相关的

特点: 该配置值为'off'时,nginx会丢弃'不合法(带有下划线)'的HTTP请求头

④  underscores_in_headers

++++++++++ '历史背景' ++++++++++
 
nginx会'默认删除带下划线'的HTTP请求头,这样做是为了避免将标头'映射到CGI变量'时出现'歧义'

 nginx反向代理导致请求header头信息丢失

 请求头带下划线导致原始请求头丢失

 (3)生成发往上游的请求体

①  proxy_pass_request_body

功能:是否将'客户端请求体'发送给'代理'服务器

②  proxy_set_body

细节点: 如果​'proxy_pass_request_body off'则'proxy_set_body'无效
 
关注:  value的形式,尤其是符合'json、yaml、xml'格式
 
强调:  会'覆盖'原始的,'重新'生成'新的'请求体

生成json的案例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29800.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot入口深入

这里写目录标题1.run()1.1 程序运行监听器 SpringApplicationRunListeners1.2 应用参数 ApplicationArguments启动加载顺序1.run() run()方法是一个SpringBoot程序的入口 SpringApplication.run(Application.class, args);看看方…

OVIS数据集代码解析

OVIS数据集代码解析 OVIS数据集格式整体和COCO类似,但是是以video的形式存储的,对应的解析代码见:https://github.com/qjy981010/cocoapi/blob/main/PythonAPI/pycocotools/ovis.py。 由于OVIS仅train提供了标注,因此&#xff0…

前端埋点实现方案

前言 领导今天又来活了😣,要记录每个页面的停留时间,以及页面的操作,是由哪个页面跳转过来的,给每个页面生成GUID上报给服务端,并且需要携带设备型号和设备唯一标识🙄 名称解释 UV&#xff0…

蓝牙运动耳机排行榜,目前排名最好的运动耳机推荐

对于运动人士来说,运动过程中佩戴着耳机听歌,既能让运动变得更加激情有动力,同时还能释放压力,放松心情。在选择运动耳机方面的要求也高,运动耳机不仅需要佩戴稳固舒适,它的防水性能也不能差,当…

Java并发常见面试题(一)

进程和线程 进程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。 在Java中,当我们启动main函数其实就是启动了一个JVM进程,而main函数所在的线…

封装自己的 jquery 框架

说到jquery,那就给大家先简单的介绍一下什么是jquery jquery是JavaScript函数的一种封装。jQuery封装了JavaScript常用的功能代码(函数),提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Aja…

机器人运动学【2】

目录1.刚体状态的表达2.顺向运动学及DH表3.逆向运动学1.刚体状态的表达 我们前面已经学习了刚体移动和转动的表达,那么怎么将两者在数学上结合呢?这里我们开始构造如下矩阵,记作: 下面我们来看一下只有移动情况下的刚体的描述: …

使用canal解决Mysql和Redis数据同步(TCP)

使用canal解决Mysql和Redis数据同步(TCP) 工作原理分析 我们在面试的时候常常听面试官问这么一个问题:你们的Mysql和Redis怎么做数据同步的,根据不同的业务场景又很多方案,你可能会说先写库再删缓存,或者延迟双删或其他方案。今…

springboot集成flowable简单实例入门

此案例是demo。功能有创建流程、完成审批、生成流程图。适合有java基础的人员看。 第一步.画流程图 resources资源包下,新建processes包,新建一个文件,我命名他apply-rest.bpmmn20.xml。bpmn20.xml后缀文件是流程图配置文件。idea的右下角的…

ImageMol

ai圈也是卷的狠啊~~ 又发现一个全球首个分子图像自监督学习框架来也 分子是维持物质化学稳定性的最小单位。对分子的研究,是药学、材料学、生物学、化学等众多科学领域的基础性问题。 分子的表征学习(Molecular Representation Learning)是…

实践 | 大型基金管理公司数据脱敏体系建设

金融行业数据脱敏安全管理要求高、数据类型复杂、脱敏数据规模庞大。作为业内领先,且支持信创环境的数据安全产品,美创数据脱敏系统在金融行业应用广泛,可满足各类复杂环境下的数据脱敏需求: 台州银行—分布式大数据平台下的及时脱…

SQL Server数据库理论篇(进行时......)

SQL Server数据库理论篇 一. 数据库的关系分类 1.1.0 关系型数据库和非关系数据库区别? 结论:两种数据库的本质在于存储数据的形式不同 1.关系型数据库概念 关系型数据库最大的特征就是表,我们将对象的属性映射为表的一个个列名&#xff…

(九)centos7案例实战——redis一主二从三哨兵高可用服务搭建

前言 本节内容是使用centos服务器搭建一套高可用的redis服务,采用的是一主二从三哨兵的模式。 需要注意的是搭建集群的过程中,我们要保证集群服务器之间可以相互访问,并且redis所需要访问的端口是开放的。我们从redis的下载,源码…

ffmpeg 安装教程

官网:Download FFmpeg window 转:ffmpeg安装教程_moon son的博客-CSDN博客_ffmpeg安装 然后解压,配置全局变量环境。点击“系统属性->高级系统设置->环境变量->系统变量”,选择“Path”条目,点击“编辑->…

将项目部署到Linux系统上

目的是让我们的项目在linux上也能运行起来 有两种部署方式,手工部署或者是通过shell脚本自动部署 手工部署 准备工作:使用ifconfig指令查出服务器的ip地址:192.168.58.130 1.在本地Idea中开发一个springboot项目,并且打包成ja…

以太网模块的传输距离怎么看

光模块的关键标准组织主要有两个:IEEE和MSA。其中GBASE开头的标准主要是IEEE802.3提出与定义的。要弄清光模块的传输距离,首先让我们要弄清楚它的命名是怎样的。 100G光模块的命名规则: 400G光模块的命名规则: 其中100G和400G光模…

SpringBoot整合Mybatis方式1:使用XML方式整合Mybatis

SpringBoot整合Mybatis简介SpringBoot整合Mybatis方式1:使用XML方式整合Mybatis1.用idea创建一个添加mybatis需要的相关依赖的工程。2.准备数据库和表3.创建表映射类4.创建mapper文件4.1 创建UsersMapper.xml文件,并添加sql语句4.2 创建mapper对应的代理…

Docker的Cgroup资源限制

Docker通过Cgroup来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配颡和使用量控制。 Cgoup 是CotrolGroups 的缩写,是Linux 内核提供的一种可以限制、记录、隔高进程组所使用的物理资源(如CPU、内存…

基于jsp的学生培训管理系统

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【教学类-18-01】20221123《蒙德里安红黄蓝格子画》(大班)

效果展示: 单页效果 多页效果 预设效果 背景需求: 2022年11月23日,作为艺术特色幼儿园,蒙德里安风格装饰在我们幼儿园的环境中。 蒙德里安是几何抽象画派的先驱,以几何图形为绘画的基本元素,与德士堡等创…