Nginx做代理时X-Forwarded-For信息头的处理

2023-10-27

如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场合,还有很多需要注意的地方,本文要说的就是在通过CDN 后到达nginx做负载均衡时请求头中的X-Forwarded-For项到底发生了什么变化。下图为简单的web架构图:


先来看一下X-Forwarded-For的定义:
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。
标准格式如下:
X-Forwarded-For: client1, proxy1, proxy2
从标准格式可以看出,X-Forwarded-For头信息可以有多个,中间用逗号分隔,第一项为真实的客户端ip,剩下的就是曾经经过的代理或负载均衡的ip地址,经过几个就会出现几个。

按照上图的Web架构图,可以很容易的看出,当用户请求经过CDN后到达Nginx负载均衡服务器时,其X-Forwarded-For头信息应该为 客户端IP,CDN的IP 但实际情况并非如此,一般情况下CDN服务商为了自身安全考虑会将这个信息做些改动,只保留客户端IP。我们可以通过程序获得X-Forwarded-For信息或者通过Nginx的add header方法来设置返回头来查看。

下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr用逗号分开,如果没有"X-Forwarded-For" 请求头,则$proxy_add_x_forwarded_for等于$remote_addr。

$remote_addr变量的值是客户端的IP

当Nginx设置X-Forwarded-For等于$proxy_add_x_forwarded_for后会有两种情况发生

1、如果从CDN过来的请求没有设置X-Forwarded-For头(通常这种事情不会发生),而到了我们这里Nginx设置将其设置为$proxy_add_x_forwarded_for的话,X-Forwarded-For的信息应该为CDN的IP,因为相对于Nginx负载均衡来说客户端即为CDN,这样的话,后端的web程序时死活也获得不了真实用户的IP的。

2、CDN设置了X-Forwarded-For,我们这里又设置了一次,且值为$proxy_add_x_forwarded_for的话,那么X-Forwarded-For的内容变成 ”客户端IP,Nginx负载均衡服务器IP“如果是这种情况的话,那后端的程序通过X-Forwarded-For获得客户端IP,则取逗号分隔的第一项即可

如上两点所说,如果我们知道了CDN设置了X-Forwarded-For信息,且只有客户端真实的IP的话,那么我们的Nginx负载均衡服务器可以不必理会该头,让它默认即可。

其实Nginx中还有一个$http_x_forwarded_for变量,这个变量中保存的内容就是请求中的X-Forwarded-For信息。如果后端获得X-Forwarded-For信息的程序兼容性不好的话(没有考虑到X-Forwarded-For含有多个IP的情况),最好就不要将X-Forwarded-For设置为 $proxy_add_x_forwarded_for。应该设置为$http_x_forwarded_for或者干脆不设置!

转载于:https://www.cnblogs.com/discuss/articles/1862259.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx做代理时X-Forwarded-For信息头的处理 的相关文章

  • 【计算机开题报告】基于JAVA的酒店管理系统的设计与实现

    1 毕业设计 论文 综述 随着社会经济和科技的迅速发展 人们对衣食住行的要求也逐渐提高 酒店 宾馆在服务行业中扮演着越来越重要的角色 本课程设计的内容旨在以管理系统的方式给人们出行提供酒店预订服务 从而能够更方便快捷的帮助酒店工作人员办理客
  • 在win10和Linux上配置SSH 无密码登录

    文章目录 一 用途 二 在本地机器上使用ssh keygen产生公钥私钥对 1 在Linux 或macOS 上产生SSH公私钥的方法 2 在win10上产生SSH公私钥的方法 a 检查windows 本地是否安装有ssh b 在本地生成SS
  • springboot git配置文件自动刷新失败问题排查

    http ip port refresh 说明 springBoot版本是1 5 9 接口路径与2 x 不同 路径区别 refresh VS actuator refresh 用postman调用refresh接口刷新git配置 报错如下
  • 性能分析与调优: Linux 内存观测工具

    目录 一 实验 1 环境 2 vmstat 3 PSI 4 swapon 5 sar 6 slabtop 7 numstat 8 ps 9 top 10 pmap 11 perf 12 bpftrace 二 问题 1 接口读写报错 2 sl
  • 服务器OS是什么意思?

    一 什么是服务器操作系统 服务器不仅仅是由高性能硬件组成 并且是要求客户端操作系统 如Windows和Mac OS 服务器还需要一个称为服务器操作系统的操作系统 二 与客户端OS的区别 无论是Windows还是Mac OS 家庭或办公室使用
  • 【2024】基于springboot的爱心捐款救助平台课题开发

    目录 一 整体目录 文档含项目摘要 前言 技术介绍 可行性分析 流程图 结构图 ER属性图 数据库表结构信息 功能介绍 测试致谢等约1万字等 二 运行截图 三 代码部分 示范 四 数据库表 示范 数据库表有注释 可以导出数据字典及更新数据库
  • 进程间通信

    进程间通信 进程间通信介绍 进程间通信目的 数据传输 一个进程需要将它的数据发送给另一个进程 资源共享 多个进程之间共享同样的资源 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止 时要通知父进程
  • Microsoft 365 for Mac激活版(原Office 365)

    Microsoft 365 for Mac原office 365 包含Word Excel PowerPoint 和 Outlook应用程序 协作办公的最佳首选 软件下载 Microsoft 365 for Mac激活版下载 Microso
  • 自定义编写zabbix_agent脚本

    vi usr lib systemd system zabbix agent servicce Unit Description Zabbix Agent After syslog target After network target S
  • Jenkins流水线怎么做?

    问CHAT Jenkins流水线怎么做 CHAT回复 Jenkins流水线是一种创建 测试和部署应用程序的方法 以下是为Jenkins创建流水线的步骤 1 安装Jenkins 首先你需要在你的服务器上安装Jenkins 这个过程可能会根据你
  • 如何利用CHAT做简单的总结体会?

    问CHAT 在测试过程中使用appium python自动化的优点和体会 CHAT回复 使用 Appium 配合 Python 进行自动化测试主要有以下几点优点 1 跨平台性 Appium 支持 iOS 和 Android 平台的应用自动化
  • 【计算机毕业设计】航空信息管理系统

    传统信息的管理大部分依赖于管理人员的手工登记与管理 然而 随着近些年信息技术的迅猛发展 让许多比较老套的信息管理模式进行了更新迭代 飞机票信息因为其管理内容繁杂 管理数量繁多导致手工进行处理不能满足广大用户的需求 因此就应运而生出相应的航空
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • ssh:connect to host github.com port 22: Connection timed out

    解决流程 1 将github的端口由22改为443 ssh T p 443 git ssh github com 2 接着输入yes进行确认 The authenticity of host ssh github com 443 192 1
  • 服务器VPS是什么意思?一文了解其含义与重要性

    在今天的数字时代 服务器扮演着至关重要的角色 它们是网站 应用程序和在线业务的基石 但是 你是否听说过VPS 本文将深入探讨什么是服务器VPS 以及为什么它在今天的互联网世界中如此重要 什么是服务器VPS 服务器的基本概念 在我们深入探讨V
  • 2024史上最全Java面试八股文(带全部答案)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 短信系统搭建主要因素|网页短信平台开发源码

    短信系统搭建主要因素 网页短信平台开发源码 随着移动互联网的快速发展 短信系统已成为企业和个人进行信息传递的重要工具 建立一个高效可靠的短信系统对于企业来说非常重要 下面我们将介绍一些影响短信系统搭建的主要因素 1 平台选择 在搭建短信系统
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基

随机推荐

  • VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】

    问题描述 使用服务器的过程中突然与服务器断连 报错如下 could not establist connection to 20 23 39 487 gt ssh connect to host 10 201 0 131 port 22 C
  • python卡方检验关键词,特征选择——卡方检验(使用Python sklearn进行实现)

    在看这篇文章之前 如果对卡方检验不熟悉 可以先参考 卡方检验 Python有包可以直接实现特征选择 也就是看自变量对因变量的相关性 今天我们先开看一下如何用卡方检验实现特征选择 1 首先import包和实验数据 from sklearn f
  • IntelliJ IDEA中生成jar包

    IntelliJ IDEA中的java项目 比如 myproject 可以生成jar包 本文以IntelliJ IDEA 2018 2 5版本为例进行介绍 方法如下 1 依次选择菜单 File gt Project Structure 打开
  • 下载安装和汉化Eclipse(详细)

    文章目录 前言 Eclipse的下载安装 总结 前言 本文详细叙述了 Eclipse的下载安装 在使用Eclipse之前需要准备好Java环境 可参考这里 JDK的下载安装和配置 提示 以下是本篇文章正文内容 下面案例可供参考 Eclips
  • mysql报错代码10051_socket error 10061/11004/10053/10051等错误总结

    Socket是应用层与TCP IP协议族通信的中间软件抽象层 它是一组接口 在设计模式中 Socket其实就是一个门面模式 它把复杂的TCP IP协议族隐藏在Socket接口后面 对用户来说 一组简单的接口就是全部 让Socket去组织数据
  • 正点原子IM6XULL阿尔法USB摄像头的远程调用(一)硬件连接

    正点原子IMX6ULL阿尔法USB摄像头的远程调用 一 硬件连接 话不多说 直接上货 1 用电源线连接电源 如图所示 2 利用USB接串口线将板子和电脑相连 电脑用U口 板子用USB UART口 如图所示 3 按开机键开机 如图所示 4 从
  • 无向图G的广度优先搜索和深度优先搜索以及完整程序

    图的遍历算法有两种 广度优先搜索和深度优先搜索 一 广度优先搜索类似于层次遍历 需要借助辅助队列 空间复杂度为O V 空间复杂度由辅助队列大小决定 时间复杂度为O V E 为避免同一顶点被多次访问 设计visited 来标记顶点 二 深度优
  • selenium家族介绍(四大组件)

    1 selenium RC selenium Server Client Libraries Selenium Server负责控制浏览器的行为 Client Libraries则是给测试人员编写测试案例时用来控制selenium Serv
  • 理解Docker跨多主机容器网络

    理解Docker跨多主机容器网络 二月 15 2016 2条评论 在Docker 1 9 出世前 跨多主机的容器通信方案大致有如下三种 1 端口映射 将宿主机A的端口P映射到容器C的网络空间监听的端口P 上 仅提供四层及以上应用和服务使用
  • 记录次数

    版本内容 1 新增词条数据报告 统计累计次数 最早时间 最晚时间等等 2 词条加入内容文本审核功能 创建 修改词条先经过微信文本安全接口审查 审查通过的才能分享公开数据 否则只能自己可见 3 新增分享 版本思考 这个小程序是有自然流量的 就
  • 8.python发送邮箱验证码——使用zmail发送邮件验证用户信息

    1 邮件工具类封装 1 1概述 在我们的注册页面时 会需要一个发送邮件的功能去验证邮箱号是否正确 同样的 可以避免一些用户恶意的注册导致数据库出现问题 这里将使用zmail的第三方库去实现发送邮件的功能 zmail官方网址 1 2实现功能流
  • yuv,rgb,hsv比较

    1 YUV和RGB互相转换的公式如下 RGB取值范围均为0 255 Y 0 299R 0 587G 0 114B U 0 147R 0 289G 0 436B V 0 615R 0 515G 0 100B R Y 1 14V G Y 0 3
  • 解决方案:QObject::moveToThread: Current thread (***) is not the object‘s thread

    报错信息 QObject moveToThread Current thread 0x5651ebdaa180 is not the object s thread 0x5651eba7e2a0 Cannot move to target
  • 【npm第6期】通过vue中npm run build --report来介绍npm传参

    最近发现vue中可以通过npm run build report来调用webpack bundle analyzer插件 具体相关代码如下 webpack prod conf js if config build bundleAnalyze
  • [HDLBits] Edgecapture

    For each bit in a 32 bit vector capture when the input signal changes from 1 in one clock cycle to 0 the next Capture me
  • 使用docker报错 :Error response from daemon: Get https://index.docker.io/v1/search?q=java&n=25: dial tcp:

    最近在学习docker时 在安装完成后去搜索镜像资源出了这个问题 开始以为是镜像加速器没配好 就试着重新配置镜像加速器 重装了docker 折腾了一番依然没有解决 具体错误信息 1 2 root localhost docker searc
  • MySQL实现删除重复数据行仅保留一行

    首先创建测试环境 创建数据库表并加入数据 接下来研究如何做到删除重读的数据行并且仅保留第一条id最小的记录 首先需要知道哪一列是重复的 所以首先筛选出重复的列 select email from user group by email ha
  • 数据库创建函数_达梦数据库创建UUID函数

    数据库创建函数 达梦数据库创建UUID函数 接触达梦数据库有一段时间了 整理了一些资料 今天分享一下达梦数据UUID自定义函数 UUID函数定义 很多数据库都有提供UUID函数 可是接触达梦数据库后 发现达梦数据库并没有UUID函数定义 不
  • C#对txt文件进行读写操作

    C 中对txt文件进行读写操作包括两种方式 一种是基于FileInfo类 调用该类的Read方法 但是该方法读出来的数据是byte格式 需要对其进行解码 将相应的字节数转换为字符 而C 中System Text引用就包含的解码的方法 相应代
  • Nginx做代理时X-Forwarded-For信息头的处理

    如今利用nginx做负载均衡的实例已经很多了 针对不同的应用场合 还有很多需要注意的地方 本文要说的就是在通过CDN 后到达nginx做负载均衡时请求头中的X Forwarded For项到底发生了什么变化 下图为简单的web架构图 先来看