众所周知,使用花生壳内网穿透对外提供web服务,其实和CDN效果差不多,后端是无法正确获取IP地址的,会显示花生壳回联地址,一般就是本机地址127.0.0.1,所以很长一段时间以来,我这里网站后台日志也好,前台记录也好,都是看不到实际IP地址的,只能通过第三方统计JS、在第三方网站查看IP地址,不仅麻烦,而且也不方便zBlog调用IP,比如在本站的留言板处,原本希望通过一个ip归属地插件显示留言网友的省市地区,但很长一段时间只能显示“本机地址”……
其实花生壳是自带解决方案的,登录花生壳后台,配件中心中是可以看到请求头扩展功能的,但遗憾的是,这是个要收费的功能。
于是,虽然很不方便,但也还是忍了。或者说自己又穷又懒了。
AI编程最近慢慢火热起来,我也跟风最近一直在玩vibe coding。一开始玩豆包,但被豆包的弱智气的半死,经常是头两版程序即将达到你的目标,但后面就越改越离谱,越改越让人生气,后来发现腾讯在主推他家的WorkBuddy和CodeBuddy,而且送不少积分,于是换成腾讯家的这两个工具接手做点小程序。效果一下子好了很多。
一开始的计划是独立做一个zblog插件,通过第三方API或其他方式获取IP,再将IP传递给后台,这个想法很容易就被CodeBuddy实现了。
我将这个插件推送到我的服务器,就可以在后台看到一个新增的真实IP插件了,经过大概10轮左右开发和调试,最终插件已经基本可用了。
在获得真实IP后,我通过劫持zblog的HTTP_X_REAL_IP方式,就可以将我插件获取的真实IP地址传递进zblog中了。
最后一步,就是将IP地址转换成省市地区,由于已经有现成的插件了,我没有再从头造轮子,而是对原有的李洋博客开发的IP归属地插件稍微修改,就可以继续调用该插件提供的{get_ipaddress($comment.IP)}函数在页面中显示正确的IP对应省市了。
总算解决了这个花生壳内网穿透无法获取客户端IP地址的问题……
我估计吧……和我一样有这个需求的,可能并不多,毕竟应该没多少人会和我一样长期用花生壳来推送zblog,我这里权当是记录一下,方便自己将来万一zblog重装了,需要重新装插件时,好回忆起来……当然了,顺道一说,这个思路不一定只能解决zBlog的问题,其他WEB网页也一样可以用这个思路来获取真实IP,就不多说了。
1、压缩包里有一个client-ip.js文件,需要放置在/zb_users/theme/当前主题模板/script/目录中
2、然后在当前主题模板的template/header.php 或相应的头部模板文件中,</head> 标签之前添加:
<script src="{$host}zb_users/theme/{$theme}/script/client-ip.js"></script>
3、将压缩包中的RealIPFix文件夹上传到zblog的/zb_users/plugin/目录中。此时在zblog后台插件管理中就可以看到真实IP修复插件,直接启用它。
4、启用后,就可以点小扳手图标进入插件的管理页面,此时插件就算完整启用了。已经可以在管理页面处看到完整的访问记录和调试信息了。
可以自行选择是否记录访问记录,认为记录不重要,只需要获取IP的朋友,关掉记录就可以了。
同时自带一个调试界面,用于检查环境是否正常,排除故障使用。
至于需要在zBlog其他地方调用IP地址的,例如让IP归属地插件可以正常调用的,直接使用zBlog或相关插件提供的函数就可以了,建议参考部署文档。
RealIPFix_部署指南.zip
另外就是,我这里只有HTTP环境(花生壳HTTPS也是要钱的……),所以开发插件的时候基本就没考虑HTTPS的应用,所以可能会在HTTPS网站上出错,建议自己用CodeBuddy之类的工具审查一下HTTPS的兼容性,自己改一下吧。
由于部署过程还需要在网站的其他位置上传JS文件并且修改模板文件,同时可能需要对MySQL数据库读写记录IP信息,所以我暂时不打算打包成一个zba插件格式上传商城(主要是考虑到一个zba插件似乎也不能去动主题目录内的文件),暂时就以这种方式发布吧,待我用一段时间,各类BUG都解决的差不多了,心情好了再考虑有没有办法打包成zba插件包、有没有可能上传到商城吧。毕竟我也不是专业人士。
好了,现在我可以安心去玩别的东西了~
最后要说的是!!虽然我已经尽可能检查了SQL注入、CSRF等常见安全问题,但本人是无法对该插件的安全性做任何保证的,如果你要用这个插件,建议你先把整个插件的源码审查一遍哦~






