Nginx中$http_host、$host、$proxy_host的区别

知识巩固!

网上看到这篇文章,这里转载记录一下。

简介

变量

是否显示端口

值是否存在

host

浏览器请求的ip,不显示端口

"Host:value"显示

值为a:b的时候,只显示a

http_host

浏览器请求的ip和端口号

“Host:value”,value存在就显示

proxy_host

被代理服务的ip和端口号

默认80不显示

其他端口显示

"Host:value"显示

配置反向代理时,接口请求报404问题

应用描述:前端应用域名为A(ww.a.com), 后端服务域名为B(www.b.com); 为了解决跨域问题,配置nginx反向代理如下:


proxy_set_header HostKaTeX parse error: Undefined control sequence: \* at position 54: …write "^/api/(.\̲*̲)" /$1 break;
proxy_pass http://www.b.com;
}
问题:这样配置完成后,接口报404问题。

解决:
方案一:将proxy_set_header注释掉
方案二:修改反向代理配置,设置请求头Host,如下所示:

location ^~ /api/ {
rewrite “^/api/(.*)$” /$1 break;
proxy_pass http://www.b.com;
proxy_set_header Host $proxy_host; //方式一:设置请求头host为www.b.com的ip和端口号
proxy_set_header Host www.b.com; //方式二:设置请求host为www.b.com

}

nginx中proxy_set_header Host $host的作用

nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求体中的含义完全相同,除了Host外还有X-Forward-For。

Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】

同理,X_Forward_For字段表示该条http请求是由谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头。

1

2

proxy_set_header Host $http_host;

proxy_set_header X-Forward-For $remote_addr;

这里的http_host和http\_host和http_hostremote_addr都是nginx的导出变量,可以在配置文件中直接使用。如果Host请求头部没有出现在请求头中,则http_host值为空,但是http\_host值为空,但是http_host值为空,但是host值为主域名。因此,一般而言,会用host代替host代替host代替http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2。

这一HTTP头一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。其中的值通过一个“逗号+空格”把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。

在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。

鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。

proxy_set_header设置Host为proxy_host,proxy\_host,proxy_hosthost与$local_host的区别

先来看下proxy_set_header的语法:**proxy_set_header**?`field``value`;

默认值:

1

2

proxy_set_header Host $proxy_host;

proxy_set_header Connection close;

上下文:http,server,location

作用:允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

1

2

proxy_set_header Host?????? $proxy_host;

proxy_set_header Connection close;

nginx对于upstream默认使用的是基于IP的转发,因此对于以下配置:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

upstream backend {?

????????``server 127.0.0.1:8080;?

????``}?

????``upstream crmtest {?

????????``server crmtest.aty.sohuno.com;?

????``}?

????``server {?

????????????``listen?????? 80;?

????????????``server_name? chuan.aty.sohuno.com;?

????????????``proxy_set_header Host $http_host;?

????????????``proxy_set_header x-forwarded-for? $remote_addr;?

????????????``proxy_buffer_size???????? 64k;?

????????????``proxy_buffers???????????? 32 64k;?

????????????``charset utf-8;?

????????????``access_log? logs/host.access.log? main;?

????????????``location = /50x.html {?

????????????????``root?? html;?

????????????``}?

????????``location / {?

????????????``proxy_pass backend ;?

????????``}?

????????``location = /customer/straightcustomer/download {?

????????????``proxy_pass http://crmtest;?

????????????``proxy_set_header Host $proxy_host;?

????????``}?

????``}

当匹配到 /customer/straightcustomer/download时,使用crmtest处理,到upstream就匹配到crmtest.aty.sohuno.com,这里直接转换成IP进行转发了。假如crmtest.aty.sohuno.com是在另一台nginx下配置的,ip为10.22.10.116,则$proxy_host则对应为10.22.10.116。此时相当于设置了Host为10.22.10.116。

1

2

3

4

5

6

7

8

9

10

11

// 如果想让Host是crmtest.aty.sohuno.com,则进行如下设置:

proxy_set_header Host crmtest.aty.sohuno.com;

// 如果不想改变请求头“Host”的值,可以这样来设置:

proxy_set_header Host $http_host;

// 但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。

// 这种情况下,更好的方式是使用$host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:

proxy_set_header Host?????? $host;

// 此外,服务器名可以和后端服务器的端口一起传送:

proxy_set_header Host $host:$proxy_port;

// 如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:

proxy_set_header Accept-Encoding "";

通过Nginx配置演示:

[root@ans3 conf]# cat nginx.conf

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; server { listen 80; server_name a.test.com; location / { proxy_pass http://10.0.0.50:8080; proxy_set_header X-Proxy-Host $proxy_host; proxy_set_header Host $http_host; index index.html index.htm; } } }

另一台服务器配置

[root@master conf]# cat nginx.conf

#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8080; server_name www.test.com aa.test.com; location / { return 200 'http_host=[$http_host] host=[$host] proxy_host=[$http_x_proxy_host] '; } } }

不携带请求头 Host

[root@ans3 conf]# curl -H ‘Host:’ --http1.0 http://a.test.com

http_host=[]
host=[www.test.com]
proxy_host=[10.0.0.50:8080]

变量

说明

http_host

请求无 Host, 则 http_host 为空, 继而无 Host 传到 proxy

host

www.test.com

proxy 无 Host 传入, 则使用其 server_name 的第一项

proxy_host

10.0.0.50:8080

取自于 proxy_pass 的参数

携带请求头 Host

[root@ans3 conf]# curl -H ‘Host🔤123’ --http1.0 http://a.test.com

http_host=[abc:123]
host=[abc]
proxy_host=[10.0.0.50:8080]

变量

说明

http_host

abc:123

给啥拿啥

host

abc

第一个:前的内容(小写)

proxy_host

10.0.0.50:8080

带端口显示

修改真实服务器的端口为默认端口

http {
include mime.types;
default_type application/octet-stream;

log\_format main '$remote\_addr - $remote\_user \[$time\_local\] "$request" ' '$status $body\_bytes\_sent "$http\_referer" ' '"$http\_user\_agent" "$http\_x\_forwarded\_for"'; access\_log logs/access.log main; sendfile on; tcp\_nopush on; keepalive\_timeout 65; server { listen 80; server\_name a.test.com; location / { proxy\_pass http://10.0.0.50:80; proxy\_set\_header X-Proxy-Host $proxy\_host; proxy\_set\_header Host $http\_host; index index.html index.htm; }

}
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on; keepalive\_timeout 65; server { listen 80; server\_name www.test.com aa.test.com; location / { return 200 'http\_host=\[$http\_host\] host=\[$host\] proxy\_host= \[$http\_x\_proxy\_host\]

';
}
}
}

访问时proxy_host会省略80端口

[root@ans3 conf]# curl -H‘Host🔤123’--http1.0 http://a.test.com

http_host=[abc:123]
host=[abc]
proxy_host=[10.0.0.50]

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

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

相关文章

【Java线程安全实战】⑧ 阶段同步的艺术:Phaser 与 Condition 的高阶玩法

📖目录1. 为什么需要Phaser和Condition?2. Phaser:动态阶段同步的智能调度系统2.1 Phaser的核心概念2.2 Phaser与CyclicBarrier的对比2.3 Phaser的典型应用场景3. Condition:线程的"个人等待区"3.1 Condition的核心概念…

基于ARM架构的Bootloader设计:完整指南

深入ARM架构的启动心脏:手把手构建可靠Bootloader你有没有遇到过这样的场景?板子上电,电源正常,晶振起振,但串口就是“哑巴”——一串乱码都没有。或者系统偶尔能启动,大多数时候却卡在某个阶段不动了。这类…

数据库事务隔离级别与Spring传播行为深度解析

本文共计约11000字,预计阅读时间25分钟。干了13年Java开发,我可以明确告诉你:事务问题是线上最隐蔽的bug来源。很多人以为加了Transactional就万事大吉,结果数据不一致、死锁、性能问题接踵而至。今天咱们就彻底搞清楚事务隔离级别…

vivado安装教程(Windows):完整版系统配置说明

Vivado安装全攻略:从零搭建高效FPGA开发环境(Windows版) 你是不是也曾在深夜试图安装Vivado,结果卡在“Error writing to file”上反复重试?或者好不容易装完,一启动就弹出“Could not start the Xilinx L…

AFM | 分布式光纤感知赋能水下智能柔顺抓取

近日,实验室在国际权威期刊Advanced Functional Materials(中科院一区Top,影响因子 19.0)上发表题为 “A Function-Structure-Integrated Optical Fingertip with Rigid-Soft Coupling Enabling Self-Decoupled Multimodal Underw…

Nginx如何实现 TCP和UDP代理?

文章目录 前言 Nginx之TCP和UDP代理 工作原理示意图 配置文件和命令参数注释 基本命令 配置实例说明 TCP代理实例UDP代理实例 总结 前言 Nginx是一个高性能的HTTP和反向代理服务器,同时也支持TCP/UDP代理。在1.9.13版本后,Nginx已经支持端口转发&…

高效构建权重矩阵 ContW 函数实现详解

在机器学习和数据挖掘领域,尤其涉及大规模数据集时,构建相似性权重矩阵 W 往往是计算瓶颈。传统的全连接图方法复杂度高,难以扩展。ContW 函数提供了一种高效的基于锚点的近似方法,通过选择少量锚点并计算局部最近邻权重,来构建稀疏表示矩阵 Z 和归一化矩阵 H,最终隐式得…

IMGConverter:轻量全能的图片格式转换处理神器 ,轻松转换为bmp,gif,heif,ico,jpeg,jpg,png .webp

轻量全能的图片格式转换处理神器IMGConverter软件,无需复杂操作,就能一站式解决图片格式转换、批量处理、轻度编辑等需求,兼顾效率与实用性,无论是日常使用还是专业场景都能轻松适配。IMGConverter:轻量全能的图片格式…

基于Simulink的光储系统动态电压恢复仿真

目录 手把手教你学Simulink 一、引言:为什么需要“动态电压恢复”? 二、光储DVR系统架构总览 核心思想: 三、关键模块1:光伏阵列与MPPT 光伏输出特性(单二极管模型简化): MPPT 算法:扰动观察法(P&O) 四、关键模块2:锂电池储能模型 SOC 更新: 五、关键…

【2026亲测】彻底禁止Windows 10/11自动更新,让电脑暂停更新10年!

你是否厌倦了Windows系统在工作或游戏时突然弹出的“正在更新”提示?虽然微软推送更新是为了安全,但在实际体验中,频繁的强制重启、更新后的驱动不兼容、甚至突如其来的“蓝屏死机”,让无数用户头疼不已。 更让人无奈的是&#xf…

JFlash下载调试模式配置:SWD接口连接与参数设定详解

JFlash SWD 调试实战指南:从连接失败到一键量产的全过程解析你有没有遇到过这样的场景?新板子焊好,兴冲冲接上J-Link,打开JFlash点击“Connect”,结果弹出一行红字:“No device found”?或者好…

Matlab实现GNMF测试阶段投影:将新数据映射到低维表示

在实际应用非负矩阵分解(NMF)或图正则化非负矩阵分解(GNMF)时,我们通常会先在训练集上学习基矩阵U,然后面对新来的测试数据时,需要快速得到其在同一低维空间中的表示V。这就是out-of-sample或测试阶段投影问题。 标准的NMF在测试阶段可以通过简单的非负最小二乘求解,但…

SSD1306 I2C模式下响应检测与错误处理核心要点

如何让 SSD1306 OLED 屏在 I2C 总线上“永不掉线”?——从响应检测到容错恢复的实战指南你有没有遇到过这样的场景:设备上电后,OLED 屏一片漆黑,而其他功能一切正常?或者系统运行几小时后,I2C 总线突然“卡…

C++ 变量作用域

局部变量局部变量在函数或代码块内部声明&#xff0c;仅在该函数或代码块内有效。生命周期从声明开始到代码块结束。例如&#xff1a;void func() {int x 10; // 局部变量cout << x; // 有效 } // cout << x; // 错误&#xff1a;x在此处不可见全局变量全局变量…

各向同性哈希(Isotropic Hashing)编码过程详解

各向同性哈希(Isotropic Hashing,简称IsoH)是一种经典的无监督线性哈希方法,其核心目标是让投影后的各维度方差尽可能相等,从而实现“各向同性”(isotropic)的比特分布。这种特性能够显著提升二进制码的均衡性和区分能力,避免传统PCA哈希中主成分主导导致的比特信息不均…

一文说清Proteus基础操作:适合初学者的通俗解释

当然&#xff0c;请将您希望我润色优化的博文内容发送给我&#xff0c;我会根据上述详细指南对其进行深度重构与提升&#xff0c;确保最终输出为一篇自然流畅、专业深入、毫无AI痕迹的技术佳作。

ModbusPoll与Modbus Slave联动测试完整示例

ModbusPoll 与 Modbus Slave 联动测试实战指南&#xff1a;零硬件搭建高效通信验证环境 你是否曾因为现场设备未到货而卡住开发进度&#xff1f; 是否在调试 Modbus 通信时&#xff0c;面对“读不到数据”、“CRC 校验失败”这类问题无从下手&#xff1f; 别急。今天我们就用…

proteus示波器使用方法图解:一文说清界面功能布局

一文讲透Proteus示波器怎么用&#xff1a;从界面布局到实战调试&#xff0c;新手也能秒上手你有没有过这样的经历&#xff1f;辛辛苦苦画完一个PWM控制电路&#xff0c;仿真一跑&#xff0c;输出电压不对——是代码写错了&#xff1f;还是反馈环路不稳定&#xff1f;又或者MOSF…

基于STM32的u8g2 OLED驱动配置:手把手教程

从零构建STM32 OLED图形界面&#xff1a;u8g2驱动的深度实践与工程优化你有没有遇到过这样的场景&#xff1f;项目里需要加一个小型显示屏&#xff0c;显示点温度、状态或菜单。第一反应是接个LCD&#xff1f;但视角窄、对比度低、还要背光控制……太麻烦。于是你把目光转向OLE…

STM32 GPIO控制有源蜂鸣器操作指南

蜂鸣器也能玩出花&#xff1f;用STM32一个GPIO口搞定报警提示音你有没有遇到过这样的场景&#xff1a;调试一块新板子&#xff0c;上电后啥反应都没有——LED不闪、屏幕不亮、串口没输出。这时候要是有个“滴”一声的启动音&#xff0c;至少能告诉你&#xff1a;芯片是活的&…