1. 程式人生 > >nginx 反向代理 取得真實IP和域名

nginx 反向代理 取得真實IP和域名

nginx反向代理後,在應用中取得的ip都是反向代理伺服器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,需要在nginx反向代理配置中新增一些配置資訊,目的將客戶端的真實ip和域名傳遞到應用程式中。

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

      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

Php程式碼  收藏程式碼
  1. /** 
  2.  * 獲取客戶端ip 
  3.  */
  4.  function getClientIP() {  
  5.     $ip = "unknown";  
  6.     /* 
  7.      * 訪問時用localhost訪問的,讀出來的是“::1”是正常情況。 
  8.      * ::1說明開啟了ipv6支援,這是ipv6下的本地迴環地址的表示。 
  9.      * 使用ip地址訪問或者關閉ipv6支援都可以不顯示這個。 
  10.      * */
  11.     if (isset($_SERVER)) {  
  12.         if (isset(
    $_SERVER["HTTP_X_FORWARDED_FOR"])) {  
  13.             $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];  
  14.         } elseif (isset($_SERVER["HTTP_CLIENT_ip"])) {  
  15.             $ip = $_SERVER["HTTP_CLIENT_ip"];  
  16.         } else {  
  17.             $ip = $_SERVER["REMOTE_ADDR"];  
  18.         }  
  19.     } else {  
  20.         if (getenv(
    'HTTP_X_FORWARDED_FOR')) {  
  21.             $ip = getenv('HTTP_X_FORWARDED_FOR');  
  22.         } elseif (getenv('HTTP_CLIENT_ip')) {  
  23.             $ip = getenv('HTTP_CLIENT_ip');  
  24.         } else {  
  25.             $ip = getenv('REMOTE_ADDR');  
  26.         }  
  27.     }  
  28.     if(trim($ip)=="::1"){  
  29.         $ip="127.0.0.1";  
  30.     }  
  31.     return$ip;   
  32. }  

java取得客戶端真實IP:

Java程式碼  收藏程式碼
  1. public String getClientIP(HttpServletRequest request) {   
  2.     String ip = request.getHeader("x-forwarded-for");   
  3.     if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {   
  4.         ip = request.getHeader("Proxy-Client-IP");   
  5.     }   
  6.     if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {   
  7.         ip = request.getHeader("WL-Proxy-Client-IP");   
  8.     }   
  9.     if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {   
  10.         ip = request.getRemoteAddr();   
  11.     }   
  12.     return ip;   
  13. }   

php取得域名:

Php程式碼  收藏程式碼
  1. $_SERVER['SERVER_NAME'];  

java取得域名:

Java程式碼  收藏程式碼
  1. request.getServerName()