先後端分離以後,採用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進行測試也不會報錯,這個值得你們注意一下。安全