Closed Winyer closed 1 year ago
补充一下,使用这个最新版的,会出现Database Query Error,前面用的是2.0.2版本是能正常使用的
比较奇怪的是网站本身是只支持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)
补充一下,使用这个最新版的,会出现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)
再加一个无关紧要的bug吧,低版本的可以在Splite数据库开启,最新版则会在报错后开启,然后无法查询IP位置
如题,我有尝试在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 环境配置异常
另类思路解决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 填写的方式,最近比较忙,后面有空改一下。
如题,我有尝试在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地址的原因?