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
变量。
这里,假设用户请求过程和上文所述一样,如下:
用户客户端--发送请求->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请求头中。
参考连接:
https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#var_proxy_add_x_forwarded_for
Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解的更多相关文章
- Nginx基础篇(2)- Nginx基本配置文件和变量详解
Nginx基本配置文件和变量详解 1. 基本配置文件 /etc/nginx/nginx.conf # nginx运行的用户 user nginx; # nginx进程数,建议设置为等于CPU总核心数. ...
- mysql show variables系统变量详解
mysql系统变量详解 mysqld服务器维护两种变量.全局变量影响服务器的全局操作.会话变量影响具体客户端连接相关操作. 服务器启动时,将所有全局变量初始化为默认值.可以在选项文件或命令行中指定的选 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- Maya 常用环境变量详解
Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...
- Shell学习之Bash变量详解(二)
Shell学习之Bash变量详解 目录 Bash变量 Bash变量注意点 用户自定义变量 环境变量 位置参数变量 预定义变量 Bash变量 用户自定义变量:在Bash中由用户定义的变量. 环境变量:这 ...
- asp.net core环境变量详解
环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...
- 4、Ubuntu系统环境变量详解
参考:Linux公社Ubuntu系统环境变量详解 UNIX/Linux系统中的环境变量和库文件的使用方法 由于Linux系统严格的权限管理,造成Ubuntu系统有多个环境变量配置文件,因此我们需要了解 ...
- 如何查找YUM安装的JAVA_HOME环境变量详解
如何查找YUM安装的JAVA_HOME环境变量详解 更新时间:2017年10月27日 09:44:56 作者:铁锚 我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...
- Python变量详解
Python变量详解 目录 Python变量详解 一.变量的定义 二.变量组成的三部分 2.1 变量名 2.1.1 变量名的命名规范 2.1.2 变量名的命名风格 2.2 赋值符号 2.3 变量值 三 ...
- Ansible Facts 变量详解
Ansible Facts 变量详解与使用案例 主机规划 添加用户账号 说明: 1. 运维人员使用的登录账号: 2. 所有的业务都放在 /app/ 下「yun用户的家目录」,避免业务数据乱放: 3. ...
随机推荐
- 容器化部署wordpress个人博客系统lnmp环境[自定义网络]
容器化部署个人博客系统lnmp环境 #告警: WARNING: IPv4 forwarding is disabled. Networking will not work. 96c083a8b5811 ...
- windows下IPv6通信(C++、MFC)
Server #include <stdio.h> #include <Ws2tcpip.h> #include <winsock2.h> #define HELL ...
- iOS11 ReplayKit2 问题总结
一.苹果自6月30日发布iOS11系统之后,其中的Airplay的协议发生变更,导致市场上的苹果直播助手(录屏)大部分变得不可用,因此在iOS11之后需要寻找新的技术方案来录屏 1)采用系统提供的Re ...
- 记 Codes 开源免费研发管理平台 —— 日报与工时融合集中式填报的创新实现
继上一回合生成式全局看板的创新实现后,本篇我们来讲一讲日报与工时融合集中式填报的创新实现. 市面上所有的研发管理软件,大多都有工时相关功能,但是却没有日报功能,好像也没什么问题,但是在使用过程中体验非 ...
- vscode设置护眼色
参考链接:https://blog.csdn.net/qq_39233554/article/details/105639331?depth_1- 打开VS code选择'文件'→'首选项'→'设置' ...
- 使用Wesky.Net.Opentools库,一行代码实现自动解析实体类summary注释信息(可用于数据实体文档的快速实现)
使用前,需要对你的项目勾选输出api文档文件. 引用Wesky.Net.OpenTools包,保持1.0.11版本或以上. 为了方便,我直接在昨天的演示基础上,继续给实体类添加注释. 昨天的演示文 ...
- CSP-S2023 题解
CSP-S 2023 题解 密码锁 发现总状态数只有 \(10^5\) 个,枚举 \(O(n)\) 暴力判断即可,复杂度 \(O(10^5 n)\). 或者每一个状态只对应了 \(81\) 个状态,枚 ...
- Linux Topicons Plus桌面工具安装
Topicons Plus是Linux系统GNOME桌面环境的工具,方便于在工具栏显示应用小图标. 1.进入GNOME商店搜搜下载TopIcons Plus工具.下载路径:https://extens ...
- json null (空值)不序列化
json null (空值)不序列化 JsonSerializerSettings jsetting = new JsonSerializerSettings(); jsetting.DefaultV ...
- java.lang.NoClassDefFoundError: com/google/gson/GsonBuilder
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/gson/GsonBuilder 解决方 ...