首页 > WordPress, 建站日志 > 解决wordpress留言评论者IP都是127.0.0.1

解决wordpress留言评论者IP都是127.0.0.1

2008年11月14日 发表评论 阅读评论

刚刚开始用2.1版本的时候就发现这个问题,所有评论这的IP都是127.0.0.1,当时也没在意,心想可能是那块没有设置好,反正评论的人也不多。前几天更新成2.6.3后,发现这个问题依旧存在,127.0.0.1似乎在评论审核的黑名单中,弄的所有的评论都变成垃圾评论,都要一个个审核,很是烦人。

上网查了下资料,遇到这个问题的人并不多,还在有人提起,也有热心人回复了大概原因以及大概解决方案:原因是空间商启用了某种缓存机制导致取IP产生错误,使得结果都是本机IP,也就是127.0.0.1。解决方案也很简单,更换获取IP语句就好。

查了下PHP获取IP的语句,主要是以下几种

$_SERVER["HTTP_X_FORWARDED_FOR";
$_SERVER["HTTP_CLIENT_IP"];
$_SERVER["REMOTE_ADDR"];
getenv("HTTP_X_FORWARDED_FOR");
getenv("HTTP_CLIENT_IP");
getenv("REMOTE_ADDR");

剩下的就很简单了,写一个测试页面,一个一个试,看那个能显示正确的IP地址,在修改/wp-includes/comment.php ,我的文件是在第718行

$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '',$_SERVER['REMOTE_ADDR'] );

将$_SERVER['REMOTE_ADDR']改成上面测试正确IP的语句,问题解决。

本人对PHP还是初学者阶段,如有叙述不当之处,还希望多多斧正。

分类: WordPress, 建站日志 标签: ,
  1. 2008年11月15日15:41 | #1

    我的正有这个问题,不过看过之后还是不懂
    $commentdata['comment_author_IP'] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,$_SERVER['REMOTE_ADDR'] );
    要改成什么。

  2. 2008年11月16日13:04 | #2

    @tomogen
    用我遇到的情况举个例子吧,写一个测试文件,比如test.php,内容如下:
    < ?php
    echo IP函数
    ?>
    依次将那6个函数放进去,通过域名/test.php访问,查看显示结果
    我的情况是,1、2、6显示为空,3、5显示的是127.0.0.1,4显示的是正确的IP,所以我把
    $commentdata['comment_author_IP'] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,$_SERVER['REMOTE_ADDR'] );
    改成
    $commentdata['comment_author_IP'] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,getenv(“HTTP_X_FORWARDED_FOR”);
    就解决了

    解释说明由于存在着安全隐患,请不要使用。
    @tomogen 的回复提到了一种解决办法,有相关问题的可以去看下。

  3. 2008年11月19日14:52 | #3

    意思我明白了,不过我照做之后会出现HTTP500错误。
    多谢解答

  4. 2008年11月19日19:35 | #4

    @tomogen
    会不会是引号问题,为了安全起见,留言板会自动把英文的引号替换成中文的引号,直接复制代码会出现错误的,要相应的把引号换回英文的呀。
    另外可以在IE的工具——Internet选项——高级里面,把“显示友好的HTTP错误消息”前面的勾去掉,就能看到具体的错误位置了。

  5. 2008年12月5日09:21 | #5

    你这样改有个安全问题,”HTTP_X_FORWARDED_FOR”这个值是通过获取HTTP头的”X_FORWARDED_FOR”属性取得.所以这里就提供给恶意破坏者一个办法:可以伪造IP地址。这样可能会有SQL注入的危险。而且安全和准确的方法是尽量避免使用getenv函数。

    我也遇到了这样的问题,http://www.jerryhong.com/2008/11/15/wordpress-plugin-comment-ip-fixer/ 上面有一个很好的解决办法。优先通过HTTP_CLIENT_IP获取IP,

  6. 2008年12月6日01:01 | #6

    @gowers
    感谢你提出的问题,我是PHP初学者,也没有注意到安全性问题。getenv函数我已经去掉了,试了下使用$_SERVER是可以取到的,估计之前写测试的时候有点小问题。你发的那个解决办法我也看了源码,源码是先判断HTTP_CLIENT_IP是否是空,为空的话就取HTTP_X_FORWARDED_FOR,HTTP_X_FORWARDED_FOR再为空的话就取REMOTE_ADDR。
    这一点比较困惑,因为不知道我使用的空间采用了什么设置,HTTP_CLIENT_IP取出来的数据值一直是空,按照你给的解决办法和直接取HTTP_X_FORWARDED_FOR是等价的,毕竟HTTP_CLIENT_IP都是空。这个安全问题暂时用正则过滤+勤备份应对了。有机会问下空间商,看看他们使用了什么设置使得默认程序取不出来IP地址

  1. 2008年12月6日01:47 | #1