Nginx代理獲取后端用戶真實IP


nginx代理后想獲取用戶的真實IP,

1.在http 模塊內增加map模塊參數:

                  map $http_x_forwarded_for $clientRealIp {
                          "" $remote_addr;
                          ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
                  }

2.修改upstream模塊的ip_hash參數:

                hash $clientRealIp;

 

 

 

3.修改兩處location模塊的proxy_set_header參數:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 要加上以下倆個參數要不會報錯
proxy_headers_hash_max_size 512;
proxy_headers_hash_bucket_size 128;

 

 

 # 要加上以下倆個參數要不會報錯

 

 

 

 

1. 幾個概念
remote_addr:如果中間沒有代理,這個就是客戶端的真實IP,如果有代理,這就是上層代理的IP.
X-Forwarded-For:一個HTTP擴展頭,格式為 X-Forwarded-For: client, proxy1, proxy2
X-Real-IP:自定義的HTTP頭,用於把客戶端真實IP一層層傳遞下去。

2.幾個變量
$remote_addr:上層IP(客戶端或代理)
$proxy_add_x_forwarded_for:包括客戶端請求頭的X-Forwarded-For和$remote_addr
$http_x_forwarded_for:就是X-Forwarded-For的值

3. 獲取客戶端真實IP的方法
    3.1 通過設置X-real-IP層層傳遞
        首層代理:proxy_set_header X-Real-IP $remote_addr;   針對首層代理,拿到真實IP
        非首層代理:proxy_set_header X-Real-IP $http_x_real_ip;  # 針對非首層代理,一直傳下去
    3.2 通過設置X-Forwarded-For請求頭
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        然后截取X-Forward-For請求頭的第一段,即是客戶端的真實IP

4. 經過CDN后,獲取用戶真實IP的方法
    4.1 一般CDN都會傳遞X-Forwarded-For請求頭,通過X-Forwarded-For請求頭獲取用戶真實IP。
    4.2 后端Nginx配置
    http {
        map $http_x_forwarded_for  $clientRealIp {
        ""      $remote_addr;
        ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
    }

    }        
    我們通過map自定義了一個變量$clientRealIp;
    如果X-Forwarded-For頭是空的,那么客戶端真實IP就是remote_addr;
    如果X-Forwarded-For頭非空,我們就通過正則匹配,捕獲到第一段,這就是用戶的真實IP;
    必須注意的是,在每一層代理都要設置X-Forwarded-For頭。

 

參考

多層代理獲取用戶真實IP - kaka_jon - 博客園
https://www.cnblogs.com/zhaojonjon/p/7293977.html

(26條消息) 代理后端的 Nginx 限制真實客戶端IP訪問問題_人生就是一場修行-CSDN博客_nginx限制客戶端ip
https://blog.csdn.net/fgf00/article/details/82260249


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM