提醒:本文最后更新于 4187 天前,文中所描述的信息可能已发生改变,请仔细核实。
最近没怎么注意,今天看了评论,发现所有评论的ip都是127.0.0.1。而且是在配置squid之后的评论如此(话说到现在都还没弄好,烦)。
因为前后端分开了,当客户端请求访问动态页面时会被前端反向代理给后端处理,所以Wordpress读到的是localhost。。。为了解决,只能让WP更智能一点,录入真实访问IP (而不是请求IP)。
解决办法,在wp-config.php 的第2行(即<?php之后),添加
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];}
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];}
$_SERVER['HTTP_X_FORWARDED_FOR']和$_SERVER['REMOTE_ADDR']都是用于获取客户端IP的,全局变量,因此可以直接调用。
$_SERVER['REMOTE_ADDR']是正在浏览当前页面用户的 IP 地址,由于服务器自身启用了反向代理,所以这个变量始终记录IP为127.0.0.1。
$_SERVER["HTTP_X_FORWARDED_FOR"]用于获取使用代理服务器用户的IP,但有时读取的仍然是代理服务器本身的IP。
因为X-Forwarded-For头的记录格式是:client1,proxy1,proxy2,所以在上面的代码中我们取的是第一个值。
转载请注明转自:kn007的个人博客的《VPS前后端分离使WordPress无法记录访客IP解决之法》
记得用上cdn的时候也是这样的,但是一直也没有个完美的解决方案,所以也不了了之了。。。不知道这个能管用不,现在也没有cdn可用了
@咕噜噜: 呵呵,也是有用的,因为cdn重新解析了。。
记得以前用CloudFlare的时候耶屎这样
解决方法类似上面的判断HTTP_X_FORWARDED_FOR是否为空
@Xider: 不过这个如果说有多层透明代理就有点鸡肋了
@Xider: 是的,这也是没办法,除非第一层就纪录
没用vps
点错了,误入此地,罪过罪过
@潜行者m: 呵呵,
按你说的做了,还是没效果
@Neysa: 怎么会呢?我有效果哦,你用什么前端?
@kn007: 我用的statpress插件。这是图片:
https://photos-6.dropbox.com/t/0/AADXvj-XZIaJ6ePb-GG1jvkr9pZ5vk_9_ycHbHduwBnATQ/10/24147259/png/32x32/6/_/1/2/QQ%E6%88%AA%E5%9B%BE20130127124425.png/Dyb_KS5RRg5NIum4YxaMuKp3N-mZ7Injakfcx-qajFQ?size=1024x768&size_mode=2
@Neysa: 你这图片我访问是403,没有权限,图片跟我这篇文章有什么关系?
@kn007: 我是想让你看一下是什么结果。是访客记录全为:127.0.0.1的截图。
@Neysa: 你的前端有没有允许和讲HTTP_X_FORWARDED_FOR发送到后端呢?
@kn007: 这是什么意思呢?
@Neysa: 你用什么前后端嘛。。。你前后端是否有传递,你自己用还会不知道。。。
@Neysa: 你最好能告诉我你用什么前端后端。如果是本地前端在反向给后端,在反响前端之时,是否传递HTTP_X_FORWARDED_FOR。实在不行,改动/wp-includes/comment.php里面的$commentdata['comment_author_IP'],将其中的$_SERVER['REMOTE_ADDR']改为$_SERVER['HTTP_X_FORWARDED_FOR']。这个只是评论者ip的获取。
@kn007: 这个我已经改过了
@Neysa: 这个,你那个插件并没有得到解决。因为这只是评论获取
@Neysa: 或者直接改动statpress插件,将其中的$_SERVER['REMOTE_ADDR']改为$_SERVER['HTTP_X_FORWARDED_FOR']就可以了。不过都有前提,前端后端有传递
@kn007: 我先找找
@Neysa: 嗯
@kn007: 插件里是这么写的,请帮我看看这个有没有问题: $ipAddress = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
@Neysa: 那就是你的前后端传递问题,你可以搞个,php,printf 看下是否有HTTP_X_FORWARDED_FOR的数据。
谢谢你啊,我再继续折腾
@Neysa: 嗯嗯嗯,好,不客气。
多谢....
用的是PaaS...用这方法也解决了
之前以为是PaaS系统的原因来着
@Yu: 呵呵
在锐壳的主机上无效。。。
@老杨: 或许你可以用探针,查看下$_SERVER段,看下有什么能利用的不
我现在就出现这个问题了,目前正在爬文解决中。。。
@ian: 我现在是是让Varnish传送个X-Real-IP给nginx,然后nginx处理。
@kn007: 按照你的方法解决了
@ian: