nginx配置解析之客戶端真實IP的傳遞

先後端分離以後,採用nginx做爲靜態服務器,並經過反向代理的方式實現接口跨域的方式,在下降開發成本的同時也帶來了諸多問題,例如客戶端真實IP的獲取。javascript

在一些特殊場景下,好比風控和支付流程,每每須要獲取用戶的ip信息,可是nginx反向代理在實現跨域的同時,也完全地改變了服務端請求來源,隔離了用戶和服務端的鏈接,以下圖
html

用戶訪問前端頁面'https://a.test.com/index/html',調用支付接口的時候,支付接口的地址是'https://a.test.com/goPay',而後由nginx反向代理到server端的'https://b.test.com/goPay'。這個時候對於server端來講,他接到的請求都是來自nginx服務器的,此時server 端默認獲取到的ip則是nginx服務器的ip。這並非咱們想要的。這個時候就須要添加以下配置:前端

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

三個header分別表示:java

X-Real-IP            客戶端或上一級代理ip
X-Real-Port          客戶端或上一級端口
X-Forwarded-For      包含了客戶端和各級代理ip的完整ip鏈路

其中X-Real-IP是必需的,後兩項選填。當只存在一級nginx代理的時候X-Real-IP和X-Forwarded-For是一致的,而當存在多級代理的時候,X-Forwarded-For 就變成了以下形式nginx

X-Forwarded-For: 客戶端ip, 一級代理ip, 二級代理ip...

在獲取客戶端ip的過程當中雖然X-Forwarded-For是選填的,可是我的建議仍是保留這,以便出現安全問題的時候,能夠根據日誌文件回溯來源。後端

有個坑~

除了上述配置部分網友還給了一個host的header跨域

proxy_set_header Host $host;

首先這個header並非必需的,其次這個header host和proxy_pass轉發產生的hostheader會出現衝突,致使接口502的狀況。可是這個配置更新後,nginx重啓包括使用nginx -t進行測試也不會報錯,這個值得你們注意一下。安全

相關文章
相關標籤/搜索