使用nginx反向代理後,應用程式如何獲取使用者真實ip
阿新 • • 發佈:2019-02-18
最近,給部署應用網站的伺服器安裝了nginx,作為客戶端和應用伺服器之間的橋樑。對於Web應用來說,這次HTTP請求的客戶端是Nginx而非真實的客戶端瀏覽器,如果不做特殊處理的話,Web應用會把Nginx當作請求的客戶端,獲取到的客戶端資訊就是Nginx的一些資訊。
現需要對Ngnix進行配置:
在代理的每個location處新增以下配置:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
proxy_set_header X-Forwarded-Proto $scheme;
1. Host
包含客戶端真實的域名和埠號; 2.
X-Forwarded-Proto
表示客戶端真實的協議(http還是https); 3.
X-Real-IP
表示客戶端真實的IP; 4. X-Forwarded-For
這個Header和X-Real-IP
類似,但它在多層代理時會包含真實客戶端及中間每個代理伺服器的IP。
例如:
#主要是用於設定一組可以在proxy_pass和fastcgi_pass指令中使用額代理伺服器,預設負載均衡方式為輪詢
upstream tomcat_client {server 127.0.0.1:8080;
}
#開啟gzip壓縮,開啟後,訪問網頁會自動壓縮
#gzip on;
#指定伺服器的名稱和引數
server {
listen 80;
server_name http://;
location / {
proxy_pass http://tomcat_client;
proxy_redirect off;
#設定代理
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
發現改為上面的配置還是無法實現獲取使用者真實的ip。需對tomcat進行配置才能解決。
request.getHeader("X-Forwarded-For")
或request.getHeader("X-Real-IP")或request.getRemoteAddr()獲取使用者ip。
Tomcat作為應用伺服器,可以通過配置Tomcat的server.xml檔案,在Host元素內最後加入:即可
<Valve className="org.apache.catalina.valves.RemoteIpValve" />