当前位置: 首页 > news >正文

nginx代理PHP获取IP 的问题

一、概述
    如今利用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架构图进行分析
    按照上图的Web架构图,可以很容易的看出,当用户请求经过CDN后到达Nginx负载均衡服务器时,其X-Forwarded-For头信息应该为 客户端IP,CDN的IP 但实际情况并非如此,一般情况下CDN服务商为了自身安全考虑会将这个信息做些改动,只保留客户端IP。我们可以通过php程序获得X-Forwarded-For信息或者通过Nginx的add header方法来设置返回头来查看。
    下面来分析请求头到达Nginx负载均衡服务器的情况;在默认情况下,Nginx并不会对X-Forwarded-For头做任何的处理,除非用户使用proxy_set_header 参数设置:
  1. 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/centos-python/articles/8521524.html

相关文章:

  • git-命令使用
  • C#解析Json
  • Integer值判断是否相等问题
  • EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
  • C语言数组的概念
  • shell中获取当前目录
  • kali使用Fluxion钓鱼WiFi
  • python url中文转码
  • 【网摘】将图片地址直接 转为 base64
  • Git Submodule使用完整教程
  • linux 扩展根分区
  • ES6通过WeakMap解决内存泄漏问题
  • 【转载】Relief 特征选择算法简单介绍
  • mysql deadlock
  • 错误 ORA-01102: cannot mount database in EXCLUSIVE mode 的处理方法
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 2019.2.20 c++ 知识梳理
  • Android优雅地处理按钮重复点击
  • JavaScript 一些 DOM 的知识点
  • Linux后台研发超实用命令总结
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • tensorflow学习笔记3——MNIST应用篇
  • 分布式任务队列Celery
  • 关于Flux,Vuex,Redux的思考
  • 好的网址,关于.net 4.0 ,vs 2010
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 时间复杂度与空间复杂度分析
  • 思维导图—你不知道的JavaScript中卷
  • NLPIR智能语义技术让大数据挖掘更简单
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #Linux(帮助手册)
  • #NOIP 2014# day.2 T2 寻找道路
  • $.each()与$(selector).each()
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $GOPATH/go.mod exists but should not goland
  • (12)目标检测_SSD基于pytorch搭建代码
  • (3)llvm ir转换过程
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)ssm高校实验室 毕业设计 800008
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • ./configure,make,make install的作用(转)
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net 4.0发布后不能正常显示图片问题
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 中的路径问题
  • .net操作Excel出错解决
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .Net下的签名与混淆
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @JSONField或@JsonProperty注解使用
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [20140403]查询是否产生日志