WordPress+Nginx+proxy取得真实IP

转载 2013年10月30日 16:27:56

WordPress+Nginx+proxy取得真实IP

分类: php 637人阅读 评论(0) 收藏 举报

如果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地址列表.

相关阅读:

  1. Nginx+Memcached高速优化DedeCMS之程序修改
  2. Nginx-JSP-Tomcat-PHP
  3. Nginx整合Tomcat
  4. Nginx服务管理脚本
  5. WordPress 自动关键字(词)外链BlogMechanics KeywordLink,SEO优化好插件

Stackflow回复:

Whatever you do, make sure not to trust data sent from the client. $_SERVER['REMOTE_ADDR']contains the real IP address of the connecting party. That is the most reliable value you can find.

However, they can be behind a proxy server in which case the proxy may have set the$_SERVER['HTTP_X_FORWARDED_FOR'], but this value is easily spoofed. For example, it can be set by someone without a proxy, or the IP can be an internal IP from the LAN behind the proxy.

This means that if you are going to save the $_SERVER['HTTP_X_FORWARDED_FOR'], make sure youalso save the $_SERVER['REMOTE_ADDR'] value. E.g. by saving both values in different fields in your database.


基本的Nginx配置: 转自张宴
user  www www;

worker_processes 10;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

#最大文件描述符
worker_rlimit_nofile 51200;

events 
{
      use epoll;

      worker_connections 51200;
}

http 
{
      include       conf/mime.types;
      default_type  application/octet-stream;

      keepalive_timeout 120;

      tcp_nodelay on;

      upstream  www.s135.com  {
              server   192.168.1.2:80;
              server   192.168.1.3:80;
              server   192.168.1.4:80;
              server   192.168.1.5:80;
      }

      upstream  blog.s135.com  {
              server   192.168.1.7:8080;
              server   192.168.1.7:8081;
              server   192.168.1.7:8082;
      }

      server
      {
              listen  80;
              server_name  www.s135.com;

              location / {
                       proxy_pass        http://www.s135.com;
                       proxy_set_header   Host             $host;
                       proxy_set_header   X-Real-IP        $remote_addr;
                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

              }

              log_format  www_s135_com  '$remote_addr - $remote_user [$time_local] $request '
                                '"$status" $body_bytes_sent "$http_referer" '
                                '"$http_user_agent" "$http_x_forwarded_for"';
              access_log  /data1/logs/www.log  www_s135_com;
      }

      server
      {
              listen  80;
              server_name  blog.s135.com;

              location / {
                       proxy_pass        http://blog.s135.com;
                       proxy_set_header   Host             $host;
                       proxy_set_header   X-Real-IP        $remote_addr;
                       proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
              }

              log_format  blog_s135_com  '$remote_addr - $remote_user [$time_local] $request '
                                '"$status" $body_bytes_sent "$http_referer" '
                                '"$http_user_agent" "$http_x_forwarded_for"';
              access_log  /data1/logs/blog.log  blog_s135_com;
      }
}
此时获取客户端IP方法如下:
function getIP() {
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if(isset($_SERVER['HTTP_X_REAL_IP'])) {
        return $_SERVER['HTTP_X_REAL_IP']);
    } else if(isset($_SERVER['REMOTE_ADDR'])) {
        return $_SERVER['REMOTE_ADDR']);
    } else {
        return '';
    }
}

PHP获取用户的真实IP

前几天面试的时候被问到通过$_SERVER['SERVER_ADDR']获取到的IP地址会有什么问题?那肯定是“如果用户通过的是 代理 获取不到真正的ip地址”。还好面试官没有进一步追问。那如何获取用...
  • qishouzhang
  • qishouzhang
  • 2015年07月28日 11:47
  • 1444

nginx 如何配置来获取用户真实IP

##1.背景知识 1.1. 前提知识点: 还有nginx中的几个变量: remote_addr 代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器...
  • bigtree_3721
  • bigtree_3721
  • 2017年05月31日 14:34
  • 4879

取得客户端真实ip

/**  * 取得客户端真实ip  *   * @param request  * @return 客户端真实ip  */  public String getIpAddr(HttpServletRe...
  • lanchengxiaoxiao
  • lanchengxiaoxiao
  • 2012年03月30日 14:34
  • 379

Nginx反向代理Tomcat日志获取真实IP

Nginx 配置文件,加入这行 proxy_set_header X-Forwarded-For $remote_addr; Tomcat 的 server.xml, 做如下修改: ...
  • mingming_vip
  • mingming_vip
  • 2016年10月28日 14:38
  • 766

jfinal --获取客户端真实的ip地址

JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP...
  • ljasdf123
  • ljasdf123
  • 2013年12月26日 16:49
  • 6908

.net取得客户端真实IP

/// /// 取得客户端真实IP。如果有代理则取第一个非内网地址 /// public static string IPAddress ...
  • PeterZhuGe
  • PeterZhuGe
  • 2016年11月25日 11:22
  • 1562

取得真实客户端IP地址

string clientIP = Request.UserHostAddress;             string userHostName = Request.UserHostName; ...
  • senlin20
  • senlin20
  • 2014年03月27日 17:31
  • 411

绕过CDN查找网站真实IP

在T00ls中看到人在问如何绕过CDN查找网站真实IP,而下面回复却说这是月经帖,每个月都有人问同样的问题,今天相对比较闲那么就来收集总结下思路吧。 0x01 验证是否存在CDN 方法1 很...
  • learner198461
  • learner198461
  • 2017年01月20日 22:52
  • 1941

获取本机的真实IP地址

Code:import java.net.InetAddress;import java.net.UnknownHostException;/** * 获取本机的真实IP地址。 * 注意:在Linux...
  • yhmhappy2006
  • yhmhappy2006
  • 2011年06月21日 17:13
  • 2182

绕过cdn获取网站的真实ip

0x00 前言           现在很多大网站基本上都使用了CDN进行加速,方便快速响应用户的请求,提高用户体验。这种做法对于我们日常的渗透测试来说,CDN的虚假IP确实很干扰我们的测试。因此很有...
  • qq_29277155
  • qq_29277155
  • 2016年09月07日 22:15
  • 10711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WordPress+Nginx+proxy取得真实IP
举报原因:
原因补充:

(最多只允许输入30个字)