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信息头的处理 的相关文章

  • 在win10和Linux上配置SSH 无密码登录

    文章目录 一 用途 二 在本地机器上使用ssh keygen产生公钥私钥对 1 在Linux 或macOS 上产生SSH公私钥的方法 2 在win10上产生SSH公私钥的方法 a 检查windows 本地是否安装有ssh b 在本地生成SS
  • 【花艺电商】SpringBoot集成MyBatis-Plus、Swagger2、SpringSecurity、OAuth2等技术整合开发

    目录 一 功能介绍 1 说明 2 功能实现 3 技术应用 二 技术详述 1 MyBatis Plus 主要体现 项目应用 2 SpringSecurity 应用作用 三 页面展示 1 登入 2 主页 3 详情 4 购物车 5 订单
  • 【计算机毕设任务书】荣皓房屋租赁平台的设计与开发

    1 本毕业设计 论文 课题应达到的目的 1 训练学生文献资料查阅 项目调研与分析能力 2 训练学生用所学知识解决实际问题的能力 3 加强对学生的专业知识进行综合训练 4 熟悉项目开发的一般方法和步骤 5 提高学生团队合作能力 2 本毕业设计
  • 【计算机开题报告】 医药信息管理系统

    一 选题依据 简述国内外研究现状 生产需求状况 说明选题目的 意义 列出主要参考文献 1 研究背景 随着医药事业的不断壮大 相关单位对于医药信息的管理变得越来越重要 传统的手工管理效率低 易出错 费时费力 不能及时精确的收集 传递 存储 加
  • VPS计算深度解析:如何选择适合你需求的服务器配置

    在当今数字时代 无论是个人用户还是企业 都需要可靠的服务器来托管其网站 应用程序和数据 VPS已经成为一种受欢迎的托管解决方案 因为它提供了稳定性 安全性和性能的理想平衡 但是 在选择适合你需求的VPS服务器配置时 你需要考虑许多因素 本文
  • 如何用Chat分析本地化运维服务有哪些?

    问CHAT 本地化运维服务有哪些 CHAT回复 本地化运维服务主要包括以下几大部分 1 系统监控和管理 密切关注系统的性能 实时发现并解决可能出现的问题 以确保服务的稳定和可用性 2 数据备份与恢复 定期进行数据备份 并在出现故障或数据丢失
  • Linux ls命令

    目录 一 配置项 1 1 ls l 1 2 ls a 1 3 ls lrt 1 4 ls ld 二 案例 2 1 查看指定文件夹下文件的数量
  • Nexus5596交换机支持3层需要的子卡

    3层子卡 nexus5596如果没有这块子卡 无法支持3层特性 TEST Cisco N5596 1 show modu Mod Ports Module Type Model Status 1 48 O2 32X10GBase T 16X
  • TeslaMate特斯拉神器本地Docker部署实现无公网远程访问

    文章目录 1 Docker部署TeslaMate 2 本地访问TeslaMate 3 Linux安装Cpolar 4 配置TeslaMate公网地址 5 远程访问TeslaMate 6 固定TeslaMate公网地址
  • 数据采集才是MES系统的核心内容

    一 数据采集在MES管理系统中的应用 1 设备数据采集 MES管理系统通过与生产设备的连接 可以实时采集设备运行状态 产量 质量等相关数据 这有助于企业及时掌握设备运行状况 优化设备资源配置 提高设备利用率 2 工艺数据采集 MES管理系统
  • nohup - 后台执行

    nohup no hang up 语法 nohup Command Arg 使用示例 nohup python a py 日志将被保留在 当前文件夹下的 nohup out 将日志放到文件 不输出到终端 echo hello gt 1 tx
  • 如何解决Mybatis-plus与Mybatis不兼容的问题:An attempt was made to call a method that does not exist. The attempt

    博主猫头虎的技术世界 欢迎来到 猫头虎的博客 探索技术的无限可能 专栏链接 精选专栏 面试题大全 面试准备的宝典 IDEA开发秘籍 提升你的IDEA技能 100天精通Golang Go语言学习之旅 领域矩阵 猫头虎技术领域矩阵 深入探索各技
  • Linux终端常见用法总结

    熟悉Linux终端的基础用法和常见技巧可以极大提高运维及开发人员的工作效率 笔者结合自身学习实践 总结以下终端用法供同行交流学习 常 见 用 法 1 快捷键 1 1 Alt 在光标位置插入上一次执行命令的最后一个参数 1 2 Ctrl R
  • RF自动化环境安装+自动化实例解析

    RF定义 通用型的 自动测试框架 绝大部分的软件的的自动化系统都可以采用它 特点 测试数据文件 Test Data 对应一个个的测试用例 测试数据文件里面使用的功能小模块叫关键字 由测试库 Test Library Robot Framew
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 界面组件DevExpress ASP.NET Core v23.2 - 拥有全新的主题样式

    DevExpress ASP NET Core Controls使用强大的混合方法 结合现代企业Web开发工具所期望的所有功能 该套件通过ASP NET Razor标记和服务器端ASP NET Core Web API的生产力和简便性 提供
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目 若依前后端分离版手把手教你本地搭建环境并运行项目 本地运行若依前后端分离 CSDN博客 参考上面搭建项目 ElaticSearch Elasticsearch 是java开发的 基于
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • MongoDB - 整合 SpringBoot 操作全流程

    目录 一 MongoDB 整合 SpringBoot 1 1 引入依赖 1 2 配置文件 1 3 集合操作 1 4 相关注解 1 5 文档操作 1 5 1 查询 1 5 2 更新 1 5 3 删除 一 MongoDB 整合 SpringBo
  • 网工内推 | 上市公司同程、科达,五险一金,年终奖,最高12k*15薪

    01 同程旅行 招聘岗位 网络工程师 职责描述 1 负责职场 门店网络规划 建设 维护 2 负责网络安全及访问控制 上网行为管理和VPN设备的日常运维 3 负责内部相关网络自动化和系统化建设 4 优化与提升网络运行质量 制定应急预案 人员培

随机推荐

  • 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架构图 先来看