主機配置nginx後如何獲取訪問者IP
阿新 • • 發佈:2019-01-08
he你早的時候寫了一個根據訪問者ip查詢天氣的小介面,那時候還沒得買域名,沒有搞nginx,測試自然沒有問題,然後隨著一個小工具一塊上線了,今天突然發現我的小工具有好幾個人在使用了,就想寫一個記錄訪問者ip和請求次數的東西,經過一番折騰程式碼寫完了,上了環境,可是我自己訪問的時候拿到的確是我主機的ip,尷尬,突然就想起之前寫的天氣那個介面GG了,果不其然,獲取的同樣是我自己主機的ip,這才想到會不會是nginx搞的鬼,然後請教了大佬,果然是:以下是修改方法
nginx反向代理後,在應用中取得的ip都是反向代理伺服器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,需要在nginx反向代理配置中新增一些配置資訊,目的將客戶端的真實ip和域名傳遞到應用程式中。
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; //獲取客戶端真實IP
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
java後臺獲取訪問者ip的程式碼:
/** * @return java.lang.String * @Description <獲取IP> * @Author Zhaiyt * @Date 9:59 2018/11/15 * @Param [request] **/ public static String getUserIp(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip= request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } if (ip.equals("0:0:0:0:0:0:0:1")) { ip = "127.0.0.1"; } return ip; }