nginx反向代理獲取用戶真實ip

nginx作反向代理時,默認的配置後端獲取到的ip都是來自於nginx,如何轉發用戶的真實ip到後端程序呢?如是是java後端,用request.getRemoteAddr();獲取到的是nginx的ip地址,而不是用戶的真實ip.html

修改nginx配置,以下:java

upstream www.xxx.com {
    ip_hash;
    server serving-server1.com:80;
    server serving-server2.com:80;
}

server {
    listen www.xxx.com:80;
    server_name www.xxx.com;
    location / {
        proxy_pass http://www.xxx.cn;
    }
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

在原來配置的基礎上加入後面的三條指令,就能夠用request.getHeader("X-Forwarded-For");獲取到訪客的ip了.nginx

附:Java獲取客戶端ip的實現shell

private static final String[] IP_HEADER_CANDIDATES = {
    "X-Forwarded-For",
    "Proxy-Client-IP",
    "WL-Proxy-Client-IP",
    "HTTP_X_FORWARDED_FOR",
    "HTTP_X_FORWARDED",
    "HTTP_X_CLUSTER_CLIENT_IP",
    "HTTP_CLIENT_IP",
    "HTTP_FORWARDED_FOR",
    "HTTP_FORWARDED",
    "HTTP_VIA",
    "REMOTE_ADDR" };

public static String getClientIpAddress(HttpServletRequest request) {
    for (String header : IP_HEADER_CANDIDATES) {
        String ip = request.getHeader(header);
        if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
            int index = ip.indexOf(",");
            if (index != -1) {
                return ip.substring(0, index);
            }
            return ip;
        }
    }
    return request.getRemoteAddr();
}

參考

  1. nginx反向代理獲取用戶真實ip
  2. nginx 如何配置來獲取用戶真實IP
  3. How to get Client IP Address using Java
  4. Getting IP address of client
相關文章
相關標籤/搜索