资讯专栏INFORMATION COLUMN

Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP。

OpenDigg / 1362人阅读

摘要:总结在作为反向代理的架构中,的其他语言也是类似的名称拿到的将会是代理的地址。本意就是远程的地址,是代理层,转发请求到,获取到的远程地址实际上是反向代理服务器,这是符合协议规则的。

nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程序中。

①:php获取REMOTE_ADDR就是这样一个情况(内网地址)。
②:获取的是攻击者伪造的ip地址。攻击者可以随便伪造一个头部信息,随便填写一个ip放到头部发过来,php获取到HTTP_CLIENT_IP就是这样一个情况。伪造的ip,导致我们数据库存储是假的ip,无从真实去判断攻击者的来源。比如批量注册帐号的注册ip,登录的ip等。
配置如下:

location ~* .(jpg|png|gif)$ {
     proxy_set_header  X-Forwarded-For $remote_addr;  
     #proxy_pass http://....
}
location ~ .php$ {
     proxy_set_header  X-Forwarded-For $remote_addr;
     #proxy_pass http://....
}

PHP代码:

function getIP() {
          $ip = "unknown";   
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            //这个提到最前面,作为优先级,nginx代理会获取到用户真实ip,发在这个环境变量上,必须要nginx配置这个环境变量HTTP_X_FORWARDED_FOR
            $ip = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("REMOTE_ADDR")) {
           //在nginx作为反向代理的架构中,使用REMOTE_ADDR拿到的将会是反向代理的的ip,即拿到是nginx服务器的ip地址。往往表现是一个内网ip。
            $ip = getenv("REMOTE_ADDR");
        } else if ($_SERVER["REMOTE_ADDR"]) {
            $ip = $_SERVER["REMOTE_ADDR"];
        } else if (getenv("HTTP_CLIENT_IP")) {
            //HTTP_CLIENT_IP攻击者可以伪造一个这样的头部信息,导致获取的是攻击者随意设置的ip地址。
            $ip = getenv("HTTP_CLIENT_IP");
        }
        return $ip;
 }

总结

在nginx作为反向代理的架构中,php的REMOTE_ADDR(其他语言也是类似的名称)拿到的将会是nginx代理的ip地址。拿不到用户的真实ip,拿到是nginx反向代理服务器地址。
REMOTE_ADDR本意就是远程的地址,nginx是代理层,转发请求到php,php获取到的远程地址实际上是nginx反向代理服务器ip,这是符合协议规则的。
但是,可以让nginx帮助我们拿到用户的真实ip,写到一个环境变量中,然后转发给我们,只要按照某个约定的名称即可,比如约定名称为HTTP_X_FORWARD_FOR(也可以约定其他名称,关键看nginx中配置,可以全公司考虑统一)。
nginx配置类似于这样:

fastcgi_param  HTTP_X_FORWARD_FOR  $remote_addr;

上一句的目的是,将HTTP_X_FORWARD_FOR的值设置为$remote_addr的值。也就是将用户真实的ip(或用户使用代理的ip)放到HTTP_X_FORWARD_FOR中去。
$remote_addr是nginx的内置变量,这个变量它得到是用户真实的ip地址(用户使用了代理,则就是代理的ip地址)。
于是在php端通过getenv("HTTP_X_FORWARDED_FOR")就可以获取到nginx传递过来的值,是用户真实的ip地址。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39780.html

相关文章

  • Nginx前端设置反向代理后端Apache如何获取访客真实IP结合PHP

    摘要:总结在作为反向代理的架构中,的其他语言也是类似的名称拿到的将会是代理的地址。本意就是远程的地址,是代理层,转发请求到,获取到的远程地址实际上是反向代理服务器,这是符合协议规则的。 nginx反向代理后,在应用中取得的ip都是反向代理服务器的ip,取得的域名也是反向代理配置的url的域名,解决该问题,需要在nginx反向代理配置中添加一些配置信息,目的将客户端的真实ip和域名传递到应用程...

    Richard_Gao 评论0 收藏0
  • 前端nginx使用札记

    摘要:它是一个高性能的和反向代理服务器,同时也可以作为的代理服务器。如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用反向代理。 nginx是什么? nginx是俄罗斯人 Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的一个十分轻量级的HTTP服务器。它是一个高性能的HTTP和反向代理服务器,同时也可以作为IMAP/POP3/SMTP的代理服务器。ngi...

    tianren124 评论0 收藏0
  • Nginx配置文件学习笔记

    摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...

    muddyway 评论0 收藏0
  • Nginx配置文件学习笔记

    摘要:配置文件学习笔记定义运行的用户和用户组进程数,建议设置为等于总核心数全局错误日志定义类型,进程文件指定进程可以打开的最大描述符数目工作模式与连接数上限这个指令是指当一个进程打开的最多文件描述符数目,理论值应该是最多打开文件数与进程数相除, Nginx配置文件学习笔记 定义Nginx运行的用户和用户组 user nginx; Nginx进程数,建议设置为等于CPU总核心数 worker...

    MoAir 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<