
1 GoBeyond 2017-03-11 16:49:00 +08:00 via Android $_SERVER['REMOTE_ADDR'] |
3 mooncakejs 2017-03-11 17:07:07 +08:00 via iPhone cdn 一般给 X_real_ip |
4 bianhua 2017-03-11 17:07:46 +08:00 @xeis 一些 CDN 会在 CDN 回源请求加 HTTP 头信息,其中可能包含访客的“真实 IP ”。具体要看是哪家 CDN ,比如 Cloudflare 是 CF-Connecting-IP 。 |
5 Mazda 2017-03-11 18:42:41 +08:00 via iPhone 自己看你用的 cdn 的文档呗,这个是最基本的 |
6 peesefoo 2017-03-11 19:05:10 +08:00 via Android X-Forwarded-For |
7 cnwtex 2017-03-11 19:30:17 +08:00 |
8 mytsing520 PRO X-Forwarded-For X-Real-IP |
9 liangmishi 2017-03-12 00:33:11 +08:00 via Android 如果用了 cdn ,那么一般在 headers 里有真实的 ip 。 如果使用了 ngnix 反向代理的话可以配置一下 nginx ,就可以在请求头里拿到 ip |
10 Allianzcortex 2017-03-12 00:40:36 +08:00 OpenResty 的内置变量里 remote_addr 在单台机器上可以用,如果做了负载均衡的话就用 http_x_forwarded_for ,来应对访问网络里有多层代理的情况。这个问题应该偏运维多一点? |
11 jitongxi 2017-03-12 07:49:28 +08:00 你访问以下, 然后把 header 里面的信息打印出来就知道了. 阿里是"Ali-Cdn-Real-Ip" |
13 Reign 2017-03-12 10:08:15 +08:00 @bianhua 我可能用的假 cloudflare 了, CF-Connecting-IP 哪里出现在 cloudflare 的 response headers 里面了??? |
15 bianhua 2017-03-12 10:59:40 +08:00 @Reign 不是 Response Header ,而是 Request Header 。 https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers- 如果你使用 PHP 的话,头信息应该在储存在$_SERVER['HTTP_CF_CONNECTING_IP']。 当然如果这样还不行,同时你在用 Nginx 的话,你可以按照 https://support.cloudflare.com/hc/en-us/articles/200170706-How-do-I-restore-original-visitor-IP-with-Nginx- 的“ Restoring the original visitor IP for your web application ”小结来配置你的 Nginx ,这样你就能直接用 REAL_IP 这个头来读取 IP 了。 如果上面都不行,仍然有解决方案: 你可以自己在程序里解析那几个 XFF 头信息(参考你的 CDN 具体给你返回了哪个 XFF ,比如 X-Forwarded-For 或者 X-Forwarded 等等)。 首先检查 REMOTE_ADDR ,看访问是否来自 CDN ,如果不是则直接使用 REMOTE_ADDR ,否则按照下面的方式解析 XFF : 把 XFF 读出来之后,从最后一台经过的服务器开始检查,看 IP 地址是否属于 CDN ,如果是则检查前一台。循环这个过程直到找到一台非 CDN 的 IP 地址,然后将这个 IP 地址作为客户端的“真实” IP 地址。 注意:这个解决方案需要详细的配置你的程序,确保它能够准确判断访问 IP 是否来自 CDN 。否则访客可以伪造 XFF ,造成任意伪造 IP 地址的问题。(同时其实也要确保你用的 CDN 是安全可信的,乱填 XFF 头也会造成安全问题) |
16 zerofiny 2017-03-12 11:06:57 +08:00 cdn 获取远程地址 X-Forwarded-For 格式: X-Forwarded-For: client1, proxy1, proxy2 。 第一个永远是客户端地址 这个头可以伪造 但是大部分网站使用 CDN 都是用这个头取客户端 IP 的。 阿里云 CDN 和腾讯 CDN 这个值都可以获取到客户端的真实地址 参考: https://imququ.com/post/x-forwarded-for-header-in-http.html |
17 ioioioioioioi 2017-03-12 13:03:12 +08:00 先获取 CDN 地址,然后判断: if ($_SERVER['REMOTE_ADDR'] == '47.1.1.1' or $_SERVER['REMOTE_ADDR'] == '120.1.1.1' ) { return $ip = strtok($_SERVER['HTTP_X_FORWARDED_FOR'], ',') ?: $_SERVER['REMOTE_ADDR']; } return $ip = $_SERVER['REMOTE_ADDR']; |
18 phantomer 2017-03-12 17:50:51 +08:00 ```php function get_client_ip($type = 0,$adv=false) { $type = $type ? 1 : 0; static $ip = NULL; if ($ip !== NULL) return $ip[$type]; if($adv){ if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $pos = array_search('unknown',$arr); if(false !== $pos) unset($arr[$pos]); $ip = trim($arr[0]); }elseif (isset($_SERVER['HTTP_CLIENT_IP'])) { $ip = $_SERVER['HTTP_CLIENT_IP']; }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } }elseif (isset($_SERVER['REMOTE_ADDR'])) { $ip = $_SERVER['REMOTE_ADDR']; } // IP 地址合法验证 $lOng= sprintf("%u",ip2long($ip)); $ip = $long ? array($ip, $long) : array('0.0.0.0', 0); return $ip[$type]; } ``` |
19 henbf 2017-03-13 11:34:20 +08:00 via iPhone nginx 的 Realip 模块 |
20 gouchaoer 2017-03-13 23:54:02 +08:00 via Android 老老实实的去 js 获取 ip ,然后上传 |