网站首页 > 精选教程 正文
问题描述
获取客户端真实网络地址,有时候让人头疼。尤其是多种中间件联合使用时,层层相套,而且大家又使用不同的规范,将客户端的真实 IP 地址保存在不同的请求头中。
在这篇笔记中,我们将尝试寻找一种通用的方案,该方案可以让我们方便地定位到客户端的真实 IP 地址。
该笔记将记录:在 Nginx 中,调试并获取客户端真实网络地址(IP Address)的相关方法。
解决方案
第一步、查看客户端的网络地址
客户端的真实网络地址是通过 HTTP 请求头传递的(除了 Proxy 协议,因为我们用的不多,所以这里未讨论该协议)
所以,我们打印所有的与网络地址有关的变量及请求头(至少是我们知道的),这样我们就能知道各种地址信息:
log_format client_ip_address '[$time_local] Host="$http_host", '
'Forwarded="$http_forwarded", '
'X-Forwarded-For="$http_x_forwarded_for", '
'X-Forwarded-Host="$http_x_forwarded_host", '
'X-Forwarded-Proto="$http_x_forwarded_proto", '
'X-REAL-IP="$http_x_real_ip", '
'realip_remote_addr="$realip_remote_addr", '
'remote_addr="$remote_addr", '
'server_addr="$server_addr", '
'upstream_addr="$upstream_addr", ' ;
server {
...
access_log /var/log/nginx/client-ip-address.log client_ip_address;
...
}
在这些地址中,如果没有出现客户端的真实网络地址,那多半表示上游下来的请求存在问题。需要修改上游服务,以传递客户端真实网络地址。
第二步、设置请求头,以传递真实地址
如果客户端的真实网络地址出现在这些字段中,那么我们需要将该地址传递给下游服务器。
这样要根据下游服务器的要求进行设置,比如下游服务器从 X-Forwarded-For 中读取客户端真实网络地址,那我们这里的 Nginx 就要设置:
# proxy_set_header X-Forwarded-For <the variable containing real_ip_address>
# 比如,如下配置行
proxy_set_header X-Forwarded-For $remote_addr;
注意事项,在 RFC 中,没有 X-Real-IP 字段的描述,该字段可能是 Web Server 自定义的字段。如果下游服务器从 X-Real-IP 中读取客户端真实网络地址,那我们就要设置 X-Real-IP 字段。
相关链接
与代理有关的 HTTP 字段
参考文献
Alphabetical index of variables
- 上一篇: Nginx为什么快到根本停不下来?
- 下一篇: nginx - 让后端应用获取真实的客户端IP
猜你喜欢
- 2024-09-24 基于IP地址来申请HTTPS证书
- 2024-09-24 从Apache apisix日志中获取客户端ip
- 2024-09-24 哎,我早就料到你获取IP地址的姿势不对啦!
- 2024-09-24 如何解决ELB和nginx配合使用时无法获取客户端真实IP的问题?
- 2024-09-24 Nginx的Http请求11个阶段之postread阶段:获取真实客户端地址的
- 2024-09-24 负载均衡获得真实源IP的6种方法
- 2024-09-24 java 游戏服务器框架 ioGame 17.1.54 netty nginx 代理获取用户真实ip
- 2024-09-24 IIS 7、8启用nginx代理后日志中获取访客真实IP方法
- 2024-09-24 CDN代理服务器获取访问者真实IP(建议收藏)
- 2024-09-24 Java获取请求者的真实IP地址
你 发表评论:
欢迎- 最近发表
-
- java 服务之间调用(rpc)(java实现服务器)
- Java机器学习库(Java ML)(二、聚类)
- 「Java库」如何使用优秀的加密库Jasypt来保护你的敏感信息?
- GitHub精选 | 轻量级Android和Java日志库
- Java面试官:MySQL binlog 有什么作用?主从延迟的了解么?
- Excel函数核武器库:50个高频场景公式——第二弹
- Excel函数核武器库:50个高频场景公式——第一弹
- Spring Cache高性能缓存库 - Caffeine简介
- Java通过Kafka Streams库来实现数据流处理
- 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)