kn007的个人博客
♥ You are here: Home > 软件与网络 > php > VPS前后端分离使WordPress无法记录访客IP解决之法

VPS前后端分离使WordPress无法记录访客IP解决之法

by | 33 Comments

提醒:本文最后更新于 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];}

$_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解决之法

donate
有所帮助?
Tags: , , , , ,

Comments

33 Comments立即评论
  1. 记得用上cdn的时候也是这样的,但是一直也没有个完美的解决方案,所以也不了了之了。。。不知道这个能管用不,现在也没有cdn可用了

    1. MOD回复

      @咕噜噜: 呵呵,也是有用的,因为cdn重新解析了。。

  2. 记得以前用CloudFlare的时候耶屎这样
    解决方法类似上面的判断HTTP_X_FORWARDED_FOR是否为空

    1. @Xider: 不过这个如果说有多层透明代理就有点鸡肋了

    2. MOD回复

      @Xider: 是的,这也是没办法,除非第一层就纪录

  3. 没用vps
    点错了,误入此地,罪过罪过

    1. MOD回复

      @潜行者m: 呵呵, :smile:

  4. 回复

    按你说的做了,还是没效果 :x

    1. MOD回复

      @Neysa: 怎么会呢?我有效果哦,你用什么前端?

    2. 回复

      @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

    3. MOD回复

      @Neysa: 你这图片我访问是403,没有权限,图片跟我这篇文章有什么关系?

    4. 回复

      @kn007: 我是想让你看一下是什么结果。是访客记录全为:127.0.0.1的截图。

    5. MOD回复

      @Neysa: 你的前端有没有允许和讲HTTP_X_FORWARDED_FOR发送到后端呢?

    6. 回复

      @kn007: 这是什么意思呢?

    7. MOD回复

      @Neysa: 你用什么前后端嘛。。。你前后端是否有传递,你自己用还会不知道。。。

    8. MOD回复

      @Neysa: 你最好能告诉我你用什么前端后端。如果是本地前端在反向给后端,在反响前端之时,是否传递HTTP_X_FORWARDED_FOR。实在不行,改动/wp-includes/comment.php里面的$commentdata['comment_author_IP'],将其中的$_SERVER['REMOTE_ADDR']改为$_SERVER['HTTP_X_FORWARDED_FOR']。这个只是评论者ip的获取。

    9. 回复

      @kn007: 这个我已经改过了

    10. MOD回复

      @Neysa: 这个,你那个插件并没有得到解决。因为这只是评论获取

    11. MOD回复

      @Neysa: 或者直接改动statpress插件,将其中的$_SERVER['REMOTE_ADDR']改为$_SERVER['HTTP_X_FORWARDED_FOR']就可以了。不过都有前提,前端后端有传递

    12. 回复

      @kn007: 我先找找

    13. MOD回复

      @Neysa: 嗯

    14. 回复

      @kn007: 插件里是这么写的,请帮我看看这个有没有问题: $ipAddress = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

    15. MOD回复

      @Neysa: 那就是你的前后端传递问题,你可以搞个,php,printf 看下是否有HTTP_X_FORWARDED_FOR的数据。

  5. 回复

    谢谢你啊,我再继续折腾

    1. MOD回复

      @Neysa: 嗯嗯嗯,好,不客气。

  6. 回复

    多谢....
    用的是PaaS...用这方法也解决了
    之前以为是PaaS系统的原因来着

    1. MOD回复

      @Yu: 呵呵

  7. LV5回复

    :x 在锐壳的主机上无效。。。

    1. MOD回复

      @老杨: 或许你可以用探针,查看下$_SERVER段,看下有什么能利用的不

  8. LV1回复

    我现在就出现这个问题了,目前正在爬文解决中。。。

    1. MOD回复

      @ian: 我现在是是让Varnish传送个X-Real-IP给nginx,然后nginx处理。

    2. LV1回复

      @kn007: 按照你的方法解决了

    3. MOD回复

      @ian: :evil:

icon_wink.gificon_neutral.gificon_mad.gificon_twisted.gificon_smile.gificon_eek.gificon_sad.gificon_rolleyes.gificon_razz.gificon_redface.gificon_surprised.gificon_mrgreen.gificon_lol.gificon_idea.gificon_biggrin.gificon_evil.gificon_cry.gificon_cool.gificon_arrow.gificon_confused.gificon_question.gificon_exclaim.gif