接上篇Docker内web服务获取真实客户端IP,在设置好REMOTE_ADDR后,通过解析IP发现用户的位置竟然是别的地区,小伙伴第一次告诉我的时候我以为是IP地址库不是很准确,并没有在意,后来自己再一次测试的时候,发现IP确实不是我真实的对外IP。

看日志发现在Android微信(v7.0.4)浏览器下,所有的AJAX请求都被微信默认代理了!!但是微信代理不代理css和图片等静态资源和WebSocket。iPhone下也不存在代理行为,这尼玛坑爹。

在这种情况下,透传过来的X-Real-IP就已经是微信服务器的IP了(遇到两个,一个上海一个天津),还好微信代理并没有抹去X-Forwarded-For中的信息,这时候如果想获取真实的客户端IP,就只能从这个里面解析了。

1
2
3
4
# Django
# ...
client_ip = request.META.get('HTTP_X_FORWARDED_FOR', request.META.get('REMOTE_ADDR')).split(',')[0].strip()
# ...

可以参考
[1].微信安卓 X5 浏览器一个让人无语的设定
[2].微信浏览器中的网络代理