字體:  

nginx 反向代理reverse proxy 如何取得真實 IP及網址

linux 發表於: 2014-8-19 16:34 來源: ADJ網路控股集團


nginx反向代理後,在應用中取得的ip都是反向代理服務器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,需要在nginx反向代理配置中添加一些配置信息,目的將客戶端的真實ip和域名傳遞到應用程序中。

nginx反向代理配置時,一般會添加下面的配置:

QUOTE:


      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header REMOTE-HOST $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 
其中第一行關於host的配置,是關於域名傳遞的配置,餘下跟IP相關。

php中取得客戶端真實IP:

QUOTE:


    /**
     * 獲取客户端ip
     */  
     function getClientIP() { 
        $ip = "unknown"; 
        /*
         * 訪問時用localhost訪問的,讀出來的是“::1”是正常情況。
         * ::1說明開啟了ipv6支持,這是ipv6下的本地回環地址的表示。
         * 使用ip地址訪問或者關閉ipv6支持都可以不顯示這個。
         * */ 
        if (isset($_SERVER)) { 
            if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { 
                $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; 
            } elseif (isset($_SERVER["HTTP_CLIENT_ip"])) { 
                $ip = $_SERVER["HTTP_CLIENT_ip"]; 
            } else { 
                $ip = $_SERVER["REMOTE_ADDR"]; 
            } 
        } else { 
            if (getenv('HTTP_X_FORWARDED_FOR')) { 
                $ip = getenv('HTTP_X_FORWARDED_FOR'); 
            } elseif (getenv('HTTP_CLIENT_ip')) { 
                $ip = getenv('HTTP_CLIENT_ip'); 
            } else { 
                $ip = getenv('REMOTE_ADDR'); 
            } 
        } 
        if(trim($ip)=="::1"){ 
            $ip="127.0.0.1"; 
        } 
        return $ip;  
    } 


php取得網址:

QUOTE:


    $_SERVER['SERVER_NAME'];