月度归档:2013年07月

Web 获取 客户端 IP

1 客户端 没有经过 代理
    REMOTE_ADDR  客户端 IP
    HTTP_X_FORWARDED_FOR   空
 
2 客户端 经过 代理( 一次或多次)
   2.1  透明 代理  
          REMOTE_ADDR  最后一个代理服务地址
          HTTP_X_FORWARDED_FOR  客户端及所有代理服务器地址, 逗号分隔
  2.2  普通匿名 代理
        HTTP_X_FORWARDED_FOR  没有客户端 IP
  2.3  欺骗 代理
        HTTP_X_FORWARDED_FOR  客户端IP是假的
  2.4 高匿名代理
        代理服务器 完全充当 客户端
 
3 服务器端 经过 反向代理
   nginx 结果
   一般 会 配置  HTTP_X_REAL_IP  为 反向代理前 的 REMOTE_ADDR
   至于 X-Forwarded-For  可以不配,或为 proxy_add_x_forwarded_for  等
   个人认为 最好不配: 这样可以保持 反向代理前的 结果
 
4 CDN
   CDN 会设置 X-Forwarded-For,  有的 该字段 不包含自己的 IP ( 最好 包含,这样后面的 服务器 好判断 )
 
总结:
   X-Forward-For 即 XFF 头 是 非 RFC 标准 头,其内容 并不总是可靠,而经过 代理后 REMOTE_ADDR 显然不是真实客户端IP
   ① 在 客户端 没有 代理时 X-Forward-For 是 服务提供商 设置的 ,是 可靠的 ,可以采用
   ② 客户端 使用了 代理 如果 是 非 欺骗性的 完全 可以将 代理服务器 做为 客户端 来看待
       如果 是 欺骗性的: 使用 该IP 会响应到 真正使用该IP的正常用户,如果谨慎处理
       但 我们 无法直接判断 客户使用的是那种代理
  所以 我们是很难 判断 真实的 用户IP的,一般 会将 代理服务器 即 REMOTE_ADDR 就看作 客户端 比如 高匿名这种。
  另外 由于 NAT 的存在,很多 真实的用户 因为在 局域网下 ,外网 IP也是一样的。 限制 IP , 就没有什么意义了。