vndroid/Access

使用Cloudflare后用户用流量访问会获取到不正确的地址0.0.0.0

Closed this issue · 9 comments

Winyer commented

如题,我有尝试在typecho的配置中加入
/** 获取用户真实IP */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }


/** 设置真实IP */ if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$_SERVER['REMOTE_ADDR']=end(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']));

都没有用,只要用户用流量访问,获取到的IP就是0.0.0.0,很奇怪啊,是需要在插件的代码里设置吗?

补充一下,在te的后台看到对方的评论地址是IPV6的,可能是因为获取到的是IPV6地址的原因?

Winyer commented

补充一下,使用这个最新版的,会出现Database Query Error,前面用的是2.0.2版本是能正常使用的

Winyer commented

比较奇怪的是网站本身是只支持IPV4的,但是获取到的访客IP却是IPV6的IP

补充一下,使用这个最新版的,会出现Database Query Error,前面用的是2.0.2版本是能正常使用的

新版的数据表格式略有不同,因此可以尝试先禁用插件,然后将旧的 _access* 数据库备份后删除,让插件重新生成新表即可。

如题,我有尝试在typecho的配置中加入 /** 获取用户真实IP */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }

/** 设置真实IP */ if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$_SERVER['REMOTE_ADDR']=end(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']));

都没有用,只要用户用流量访问,获取到的IP就是0.0.0.0,很奇怪啊,是需要在插件的代码里设置吗?

补充一下,在te的后台看到对方的评论地址是IPV6的,可能是因为获取到的是IPV6地址的原因?

获取真实地址不需要修改 Typecho,需要在 NGINX 或其他 Proxy 中进行配置,可参考 Cloudflare CDN - 获取访问用户真实IP(而不是CDN节点IP)

Winyer commented

补充一下,使用这个最新版的,会出现Database Query Error,前面用的是2.0.2版本是能正常使用的

新版的数据表格式略有不同,因此可以尝试先禁用插件,然后将旧的 _access* 数据库备份后删除,让插件重新生成新表即可。

但是如果我想保存以前的访问记录该如何更新插件呢,谢谢回答

Winyer commented

如题,我有尝试在typecho的配置中加入 /** 获取用户真实IP */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }
/** 设置真实IP */ if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$_SERVER['REMOTE_ADDR']=end(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']));
都没有用,只要用户用流量访问,获取到的IP就是0.0.0.0,很奇怪啊,是需要在插件的代码里设置吗?
补充一下,在te的后台看到对方的评论地址是IPV6的,可能是因为获取到的是IPV6地址的原因?

获取真实地址不需要修改 Typecho,需要在 NGINX 或其他 Proxy 中进行配置,可参考 Cloudflare CDN - 获取访问用户真实IP(而不是CDN节点IP)

再加一个无关紧要的bug吧,低版本的可以在Splite数据库开启,最新版则会在报错后开启,然后无法查询IP位置

Winyer commented

如题,我有尝试在typecho的配置中加入 /** 获取用户真实IP */ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $list[0]; }
/** 设置真实IP */ if(isset($_SERVER['HTTP_CF_CONNECTING_IP']))$_SERVER['REMOTE_ADDR']=$_SERVER['HTTP_CF_CONNECTING_IP']; else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))$_SERVER['REMOTE_ADDR']=end(explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']));
都没有用,只要用户用流量访问,获取到的IP就是0.0.0.0,很奇怪啊,是需要在插件的代码里设置吗?
补充一下,在te的后台看到对方的评论地址是IPV6的,可能是因为获取到的是IPV6地址的原因?

获取真实地址不需要修改 Typecho,需要在 NGINX 或其他 Proxy 中进行配置,可参考 Cloudflare CDN - 获取访问用户真实IP(而不是CDN节点IP)

再加一个无关紧要的bug吧,低版本的可以在Splite数据库开启,最新版则会在报错后开启,然后无法查询IP位置

补充一下,提示:

IP查询失败
网络异常或 PHP 环境配置异常

Winyer commented

另类思路解决0.0.0.0

使用条件:
因为我是使用了CF后出现的获取到IPV6地址,又加上我使用的Access插件为低版本不能正确获取IPV6地址,而新版本与旧版本不兼容不能保存以前的数据,所以最后的解决方案为关闭CF的IPV6访问,具体方法可以看这篇文章:https://lishuma.com/archives/3229

希望可以帮到后面出现一样问题的朋友

Cloudflare CDN - 获取访问用户真实IP(而不是CDN节点IP)

0.0.0.0 的问题是中间件没有设置正确的 set_real_ip_from (NGINX)属性导致的,非 Typecho 和 Access 插件的问题。

IP 查询失败是之前插件用的是离线 SQLite 地址数据库(这个地址库免费版后面停止更新了,只有付费版的),因为太长时间不更新,存在大量地址判断不准确的问题,在后面的版本中更换为了在线 API 判断归属地,但是这个服务不是很稳定,免费版的查询接口要么限制查询频率,要么需要付费 Token,并且如果是海外机器的话,这个接口请求会报错,后面考虑多支持几个接口,让用户自行申请 Token 填写的方式,最近比较忙,后面有空改一下。