WordPress+Nginx+proxy取得真实IP

如果WordPress运行在Nginx作为proxy代理的后端,那么,WP会默认取得$_SERVER['remote_addr']的IP地址.其实这个IP地址是前端Nginx的IP地址,是不对的.如何才能使WordPress取得真实IP地址呢?方法很简单,有几种,下面说下两种:

首先,我们定义一下,假设运行Nginx Proxy的,为服务器A,而运行WordPress的,为服务器B(可以是Nginx,Apache,Lighttpd,IIS等).

1.使用HttpRealIpModule模块:HTTP_X_REAL_IP.
HttpRealIpModule模块不会默认安装到Nginx中.您需要配置Nginx,添加--with-http_realip_module选项重新编译安装一次Nginx.

然后在Nginx Proxy前端添加:
proxy_set_header  X-Real-IP        $remote_addr;

重新加载Nginx的配置:
/usr/local/nginx/sbin/nginx -s reload

这时候,客户真实IP会保存在$_SERVER['HTTP_X_REAL_IP']变量中,如果使用php程序,输出:

echo $_SERVER['HTTP_X_REAL_IP'];

就会得到用户的真实IP了.

修改WordPress根目录下的wp-config.php:
在第二行添加:
if (isset($_SERVER['HTTP_X_REAL_IP'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
}

保存退出,完成!

2.使用HTTP_X_FORWARDED_FOR变量

不用安装其它模块.

然后在Nginx Proxy前端,也就是服务器A添加:
proxy_set_header X-Forwarded-For  $remote_addr;

重新加载Nginx的配置:
/usr/local/nginx/sbin/nginx -s reload

这时候,客户真实IP则会保存在$_SERVER['HTTP_X_FORWARDED_FOR']变量中,

修改WordPress根目录下的wp-config.php:
在第二行添加:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $ips[0];
}

保存退出,完成!

现在试在WP中添加一个新评论,看下是不是使用了真实IP了?

不但在WordPress可以使用这种方法,举一反三,这种方法可以使用到其它相似的环境中.

如果在php程序中这样输出:

<?php

print_r($_SERVER);

?>

将会得到一些类似的信息,如下图:

nginx_real_ip,admclub.com
图中,
REMOTE_ADDR是前端代理Nginx,也就是服务器A的IP地址.
HTTP_X_REAL_IP就是用户的真实IP地址,这个是有用的.
HTTP_X_FORWARDED_FOR也是用户的真实IP地址,这个是有用的.真如果经过很多次跳转的话,这里将会得到一串以","分隔的IP地址列表.
发表评论?

2 条评论。

  1. 介绍的很详细。两个都用最好了:
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>