he你早的時候寫了一個根據訪問者ip查詢天氣的小接口,那時候還沒得買域名,沒有搞nginx,測試天然沒有問題,而後隨着一個小工具一塊上線了,今天忽然發現個人小工具備好幾我的在使用了,就想寫一個記錄訪問者ip和請求次數的東西,通過一番折騰代碼寫完了,上了環境,但是我本身訪問的時候拿到的確是我主機的ip,尷尬,忽然就想起以前寫的天氣那個接口GG了,果不其然,獲取的一樣是我本身主機的ip,這纔想到會不會是nginx搞的鬼,而後請教了大佬,果真是:如下是修改方法java
nginx反向代理後,在應用中取得的ip都是反向代理服務器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,須要在nginx反向代理配置中添加一些配置信息,目的將客戶端的真實ip和域名傳遞到應用程序中。nginx
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; }