WordPress+Nginx+proxy取得真實IP

若是WordPress運行在Nginx做爲proxy代理的後端,那麼,WP會默認取得$_SERVER['remote_addr']的IP地址.其實這個IP地址是前端Nginx的IP地址,是不對的.如何才能使WordPress取得真實IP地址呢?方法很簡單,有幾種,下面說下兩種:php

首先,咱們定義一下,假設運行Nginx Proxy的,爲服務器A,而運行WordPress的,爲服務器B(能夠是Nginx,Apache,Lighttpd,IIS等).前端

1.使用HttpRealIpModule模塊:HTTP_X_REAL_IP.
HttpRealIpModule模塊不會默認安裝到Nginx中.您須要配置Nginx,添加--with-http_realip_module選項從新編譯安裝一次Nginx.nginx

而後在Nginx Proxy前端添加:
proxy_set_header  X-Real-IP        $remote_addr;apache

從新加載Nginx的配置:
/usr/local/nginx/sbin/nginx -s reload後端

這時候,客戶真實IP會保存在$_SERVER['HTTP_X_REAL_IP']變量中,若是使用php程序,輸出:tomcat

echo $_SERVER['HTTP_X_REAL_IP'];服務器

就會獲得用戶的真實IP了.jsp

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

保存退出,完成!wordpress

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地址列表.
相關文章
相關標籤/搜索