Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

$remote_addr

代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

那么,默认情况下,针对Nginx1而言, $remote_addr为用户客户端IP,对Nginx2而言, $remote_addr则为Nginx1的IP。此时如果希望Nginx2也可以获取用户客户端IP,那要怎么处理呢?答案如下:

在Nginx1配置文件中使用 proxy_set_header为转发请求设置请求头

proxy_set_header X-Real-IP $remote_addr; // X-Real-IP 为请求头名称,可自定义

然后,在Nginx2 配置文件中通过 $http_x_real_ip来获取 X-Real-IP请求头的值来获取真实客户端IP.

此时,如果要求”后端服务器”也要获取用户客户端IP,咋处理呢?做法和上述类似,在Nginx2配置文件中,使用 proxy_set_header做同样的配置,即:

proxy_set_header X-Real-IP $remote_addr;

然后,”后端服务器”获取请求头”X-Real-IP”的值即为用户客户端IP。

很多HTTP代理会在HTTP协议头中添加 X-Forwarded-For头,用来追踪请求的来源。 X-Forwarded-For的格式如下:

X-Forwarded-For包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在 X-Forwarded-For右边。

$proxy_add_x_forwarded_for

代表附加 $remote_addr变量的客户端请求头 X-Forwarded-For ,其值如果包含多个地址,用逗号+空格分隔,标准格式如下:

X-Forwarded-For: clientIP, proxyIP1, proxyIP2 # 最左边的clientIp即为客户端真实IP

如果 X-Forwarded-For字段没出现在客户端请求头, $proxy_add_x_forwarded_for 等同于 $remote_addr 变量。

这里,假设用户请求流程与上述相同,如下所示:

[En]

Here, assume that the user request process is the same as described above, as follows:

用户客户端--发送请求->Nginx1 --转发请求-->Nginx2->后端服务器

假设,仅在Nginx1配置文件中进行了以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,Nginx2配置的 X-Forwarded-For请求头的值即为 clientIP当然,这个结论的前提是,客户端IP没有配置 X-Forwarded-For 请求头,因为如上所述,客户端没有出现这个请求头时, $proxy_add_x_forwarded_for 的值即为 $remote_addr 变量的值,否则,则是客户端为 X-forwarded-for 请求头的实际值

接着,假设Nginx2配置文件也进行以下配置

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

那么,”后端服务器”获取的 X-Forwarded-For请求头的值将为 clientIP, Nginx1IP。也就是说以上命令的执行是个叠加的过程(类似Python的列表的 append方法的处理过程),可以简单理解为 如果存在上级代理,执行以上命令时,会把上级代理IP追加到X-Forwarded-For请求头总,否则把客户端IP $remote_addr 、或者客户端 X-Forwarded-For 请求头的值(如果有的话)追加到X-Forwarded-For请求头中。

参考连接:

Original: https://www.cnblogs.com/shouke/p/15511149.html
Author: 授客
Title: Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/524399/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JuiceFS 在数据湖存储架构上的探索

    大家好,我是来自 Juicedata 的高昌健,今天想跟大家分享的主题是《JuiceFS 在数据湖存储架构上的探索》,以下是今天分享的提纲: 首先我会简单的介绍一下大数据存储架构变…

    Linux 2023年6月14日
    0141
  • 机器学习学习笔记之三:朴素贝叶斯

    条件概率和贝叶斯公式 (p(x|y)) 表示在 (y) 发生的条件下 (x) 发生的概率。 条件概率公式:已知 (p(x)) 和 (p(y)),以及(x), (y)同时发生的概率(…

    Linux 2023年6月14日
    061
  • 自动化集成:Pipeline整合Docker容器

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译、打包、镜像构建、部署等操作; 本篇文章主要描述流水线集成Docker用法。 一…

    Linux 2023年5月27日
    0100
  • USB转RS232串口应用

    RS232串口是用于数据串行通信传输的标准之一,该标准定义了信号的电气特性和时序、信号的含义以及连接器的物理尺寸和引脚排列。RS232协议规范定义的是DB25接口,实际上大多数RS…

    Linux 2023年6月7日
    0101
  • 数字数组

    3、【剑指Offer学习】【面试题03:找出数组中重复的数字】 4、【剑指Offer学习】【面试题04:二维数组中的查找】 11、【剑指Offer学习】【面试题11:旋转数组的最小…

    Linux 2023年6月13日
    0116
  • 【抄】Shell正则表达式

    shell 正则语法基础 copy from: https://man.linuxde.net/docs/shell_regex.html 正则表达式的分类 基本的正则表达式(Ba…

    Linux 2023年5月28日
    096
  • 飞鸽传书:一个局域网QQ

    推荐一个类似局域网QQ的免费软件——飞鸽传书,支持windows、mac、Linux、安卓、苹果手机。 飞鸽传书:一个局域网QQ 局域网文件和消息互传应该用什么呢?在这里推荐一个类…

    Linux 2023年6月6日
    099
  • 云主机实现校园网使用网络

    下载SoftEther 虚拟专用网络 Server 管理工具和 Open虚拟专用网络 GUI工具 配置云主机 tar -zxvf softether-vpnserver-v4.28…

    Linux 2023年6月8日
    081
  • 快速掌握Linux三剑客命令使用

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    094
  • 23种设计模式概要及易懂的例子

    创建型模式(共五种) 工厂方法模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。 个人总结: 通过对象工厂灵活地生产多种对象 抽…

    Linux 2023年6月13日
    092
  • Wine 运行百度云盘 中文乱码解决;wine中文乱码解决;fedora 34 运行百度网盘;

    今天需要下个 imagenet 的 ILSVRC2012 数据集,找到了网友在百度网盘中分享的下载好的; 但是因为本人使用的是 fedora 34 系统,所以尝试下载 百度网盘 l…

    Linux 2023年5月27日
    076
  • 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review…

    Linux 2023年6月6日
    0103
  • 雷霆传奇H5光柱版游戏详细图文架设教程

    前言 想体验经典传奇的热血PK吗?想体验满级VIP的尊贵吗?想体验一刀99999的爽快吗?各种极品炫酷时装、坐骑、翅膀、宠物通通给你,就在光柱版雷霆传奇H5! 本文讲解雷霆传奇架设…

    Linux 2023年6月7日
    0131
  • 软件工程 软件测试 第6篇随笔

    5、软件测试 1.软件测试的目的: 测试是一个为了发现错误而执行程序的过程 一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试用例 一个成功的测试是指揭示了迄今为止尚未发现…

    Linux 2023年6月7日
    0112
  • 博客园装饰——(二)滚动到页面顶部或底部

    功能描述: 1. 当页面向下滚动一定距离时,向下滚动到底部的按钮以淡入的效果出现,并以固定定位显示。且滚动到一定距离(快接近所设置的底部)时,该按钮又会以淡出效果消失。 2. 当页…

    Linux 2023年6月14日
    081
  • 关于 Promise 的一些简单理解

    一、ES6 中的 Promise 1、JS 如何解决 异步问题? (1)什么是 同步、异步?同步指的是 需要等待 前一个处理 完成,才会进行 下一个处理。异步指的是 不需要等待 前…

    Linux 2023年6月11日
    0105
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球