最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx暴露出請(qǐng)求的真實(shí)IP的問(wèn)題

 更新時(shí)間:2023年10月31日 16:51:32   作者:vnjohn  
在工作中,經(jīng)常會(huì)用用戶(hù)實(shí)際請(qǐng)求的IP地址,本文主要介紹了Nginx暴露出請(qǐng)求的真實(shí)IP的問(wèn)題,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

在工作中,經(jīng)常會(huì)用用戶(hù)實(shí)際請(qǐng)求的 IP 地址,當(dāng)需要記錄到日志信息時(shí)或者在請(qǐng)求其他的第三方接口時(shí)需要用到實(shí)際的用戶(hù) IP 地址傳入,在本節(jié)中會(huì)提供服務(wù)端在實(shí)際獲取 IP 地址的源碼以及通過(guò) Nginx 代理后 IP 地址隱藏的問(wèn)題

用途/場(chǎng)景

獲取經(jīng)緯度

無(wú)論是小程序還是 App 端,當(dāng)用戶(hù)未開(kāi)啟地理位置授權(quán)時(shí),在前端頁(yè)面是無(wú)法拿到當(dāng)前用戶(hù)所在的經(jīng)緯度信息的,這時(shí)候還有另外一種途徑來(lái)獲取經(jīng)緯度,那就是通過(guò) IP 地址來(lái)解析用戶(hù)真實(shí)請(qǐng)求時(shí)所在的經(jīng)緯度

在一般情況下,都是由前端來(lái)拿到這塊請(qǐng)求的 IP,可能由于某些 API 或版本的限制,導(dǎo)致前端在所獲取的 IP 地址不準(zhǔn)確,此時(shí),不得不讓后端的大佬 CASE 出手了

支付接口

微信 > 小程序支付文檔中,終端IP:spbill_create_ip 參數(shù)是必填項(xiàng),雖然在微信那一側(cè)不會(huì)去校驗(yàn)這塊的 IP 地址是否準(zhǔn)確,但真實(shí)的 IP 地址有利用我們?nèi)ヅ挪榫€上問(wèn)題,比如 IP 地址都是 127.0.0.1 這樣的,你永遠(yuǎn)都分辨不出到底請(qǐng)求是從那一塊服務(wù)進(jìn)來(lái)的

白名單配置

當(dāng)請(qǐng)求第三方接口 API 時(shí),若我們所請(qǐng)求的 IP 地址未配置進(jìn)白名單時(shí),我們是無(wú)法從第三方獲取到我們想要得到的信息的,這時(shí)候有了前置或后置日志打印我們請(qǐng)求時(shí)的 IP,能夠更快的幫助我們解決問(wèn)題

比較友善的第三方 API,在我們請(qǐng)求接口出現(xiàn)白名單的問(wèn)題,會(huì)將我們的 IP 進(jìn)行返回提示 “該 IP:Xxx,未配置白名單,請(qǐng)聯(lián)系管理員!”,這時(shí)直接拿到返回的錯(cuò)誤信息內(nèi)容進(jìn)行配置即可,無(wú)須任何的日志輸入

但是有的第三方 API 就比較雞肋,只是返回一段 "請(qǐng)求 IP 未配置白名單,請(qǐng)聯(lián)系管理員!”,這時(shí)候如果不+日志打印,那中間去找部署服務(wù)的 IP 花費(fèi)的時(shí)間就比這日志打印的時(shí)間多了個(gè)去

實(shí)現(xiàn)源碼

請(qǐng)求工具類(lèi)

/**
 * @author vnjohn
 * @since 2023/10/30
 */
public class IPv4Util {

    private static final String HEADER_FORWARDED_FOR = "x-forwarded-for";
    private static final String HEADER_PROXY_CLIENT_IP = "Proxy-Client-IP";
    private static final String HEADER_WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
    private static final String HEADER_HTTP_CLIENT_IP = "http_client_ip";
    private static final String HEADER_HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR";

    private static final String UNKNOWN = "unknown";
    private static final String CHAR_COLON = ":";
    private static final String CHAR_COMMA = ",";

    public static String getClientIp(HttpServletRequest request) {
        String ip = request.getHeader(HEADER_FORWARDED_FOR);
        boolean ipIsEmpty = ip == null || ip.length() == 0;
        if (ipIsEmpty || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader(HEADER_PROXY_CLIENT_IP);
        }
        if (ipIsEmpty || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader(HEADER_WL_PROXY_CLIENT_IP);
        }
        if (ipIsEmpty || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (ipIsEmpty || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader(HEADER_HTTP_CLIENT_IP);
        }
        if (ipIsEmpty || UNKNOWN.equalsIgnoreCase(ip)) {
            ip = request.getHeader(HEADER_HTTP_X_FORWARDED_FOR);
        }
        // 如果是多級(jí)代理,那么取第一個(gè)ip為客戶(hù)ip
        if (ip != null && ip.contains(CHAR_COMMA)) {
            ip = ip.substring(ip.lastIndexOf(CHAR_COMMA) + 1, ip.length()).trim();
        }
        //判斷IP是否存在帶有端口號(hào)的情況、應(yīng)該要去掉端口號(hào)
        if (ip != null && ip.contains(CHAR_COLON)) {
            ip = ip.substring(0, ip.indexOf(CHAR_COLON));
        }
        return ip;
    }

    /**
     * 獲取請(qǐng)求的ip
     */
    public static String getRequestIp() {
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        // 從獲取 RequestAttributes 中獲取 HttpServletRequest 信息
        HttpServletRequest request = (HttpServletRequest) requestAttributes.resolveReference(RequestAttributes.REFERENCE_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.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

    public static void main(String[] args) {
        System.out.println(getRequestIp());
    }
}

在其他地方,需要獲取 IP 時(shí),只需要按如下傳入?yún)?shù):

HttpServletRequest request

如下調(diào)用即可:

IPv4Util.getClientIp(request);

Nginx 代理配置

在 server 標(biāo)簽?zāi)K中指定的請(qǐng)求前綴配置一個(gè) location 或直接在 server 標(biāo)簽內(nèi)進(jìn)行配置,如下:

location /app {
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_pass http://localhost:8084;
}

只有當(dāng)設(shè)置了 proxy_set_header X-Real-IP 代理參數(shù)以后,獲取服務(wù)請(qǐng)求的 IP 才是準(zhǔn)確的

小結(jié)

注意:只有在 Nginx 代理配置以下內(nèi)容以后,通過(guò)請(qǐng)求工具類(lèi)才能獲取到真實(shí)的 IP 地址!??!

總結(jié)

該篇博文主要介紹的是如何在服務(wù)端中獲取用戶(hù)請(qǐng)求的真實(shí) IP 地址,通過(guò)幾種用途/場(chǎng)景介紹其所在的必要性:獲取經(jīng)緯度、支付接口、白名單配置,當(dāng)然,為了讓你能夠快速的運(yùn)用起來(lái),提供了請(qǐng)求工具類(lèi)的源碼以及告知你如何在 Nginx 進(jìn)行代理配置,希望這篇短文能夠幫助到您,解決您實(shí)際工作中的一些問(wèn)題

到此這篇關(guān)于Nginx暴露出請(qǐng)求的真實(shí)IP的問(wèn)題解決的文章就介紹到這了,更多相關(guān)Nginx暴露請(qǐng)求的真實(shí)IP內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nginx搭建文件服務(wù)器的詳細(xì)過(guò)程

    nginx搭建文件服務(wù)器的詳細(xì)過(guò)程

    這篇文章主要介紹了nginx搭建文件服務(wù)器,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • shell腳本定時(shí)統(tǒng)計(jì)Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫(kù)

    shell腳本定時(shí)統(tǒng)計(jì)Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫(kù)

    這篇文章主要介紹了shell腳本定時(shí)統(tǒng)計(jì)Nginx下access.log的PV并發(fā)送給API保存到數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • nginx實(shí)現(xiàn)一個(gè)域名配置多個(gè)laravel項(xiàng)目的方法示例

    nginx實(shí)現(xiàn)一個(gè)域名配置多個(gè)laravel項(xiàng)目的方法示例

    這篇文章主要介紹了nginx實(shí)現(xiàn)一個(gè)域名配置多個(gè)laravel項(xiàng)目的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • nginx 配置代理服務(wù)地址最后多加反斜杠和不加反斜杠的區(qū)別小結(jié)

    nginx 配置代理服務(wù)地址最后多加反斜杠和不加反斜杠的區(qū)別小結(jié)

    在使用Nginx配置代理服務(wù)時(shí),地址最后是否添加反斜杠(/)會(huì)對(duì)代理的URL處理產(chǎn)生影響,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-08-08
  • Nginx請(qǐng)求頭丟失的問(wèn)題解決

    Nginx請(qǐng)求頭丟失的問(wèn)題解決

    本文主要介紹了在使用Nginx進(jìn)行請(qǐng)求轉(zhuǎn)發(fā)時(shí),遇到請(qǐng)求頭參數(shù)丟失的問(wèn)題,導(dǎo)致的原因可能是api_key_id和api_key_value這2個(gè)參數(shù)傳遞過(guò)程中丟失或則根本沒(méi)傳遞,下面就來(lái)具體介紹一下
    2024-12-12
  • nginx中的日志切割詳解

    nginx中的日志切割詳解

    Nginx日志切割是定期將訪問(wèn)日志和錯(cuò)誤日志分割成多個(gè)文件,以?xún)?yōu)化性能、便于管理和分析,常見(jiàn)的實(shí)現(xiàn)方法包括使用logrotate工具和編寫(xiě)自定義腳本,解決常見(jiàn)的問(wèn)題如Nginx不再寫(xiě)入新日志和權(quán)限問(wèn)題,需要確保正確的信號(hào)發(fā)送和權(quán)限設(shè)置
    2025-11-11
  • nginx proxy_redirect的作用及說(shuō)明

    nginx proxy_redirect的作用及說(shuō)明

    這篇文章主要介紹了nginx proxy_redirect的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 詳解Nginx Location配置

    詳解Nginx Location配置

    本篇文章給大家分享了Nginx Location配置的相關(guān)步驟以及具體方法,有需要的朋友參考學(xué)習(xí)下。
    2018-05-05
  • Nginx部署SSL證書(shū)的過(guò)程

    Nginx部署SSL證書(shū)的過(guò)程

    SSL證書(shū)是數(shù)字證書(shū)的一種,類(lèi)似于駕駛證、護(hù)照和營(yíng)業(yè)執(zhí)照的電子副本,這篇文章主要介紹了Nginx部署SSL證書(shū)的相關(guān)知識(shí),需要的朋友可以參考下
    2022-10-10
  • 一文詳解Nginx中l(wèi)ocation的使用方法

    一文詳解Nginx中l(wèi)ocation的使用方法

    本篇博客介紹了nginx的核心配置模塊中的location部分的詳解,包括location的語(yǔ)法規(guī)則(=? ^~? ~? ~*? 不帶符號(hào)? \)的功能、用法以及詳細(xì)的示例,通過(guò)本篇博客可以加深對(duì)location的使用的理解,需要的朋友可以參考下
    2026-04-04

最新評(píng)論

汝阳县| 田阳县| 仲巴县| 大邑县| 六安市| 安塞县| 湖南省| SHOW| 江孜县| 德惠市| 三门峡市| 枣强县| 封开县| 海淀区| 健康| 台东市| 元谋县| 洱源县| 冀州市| 湖北省| 乐平市| 六枝特区| 高陵县| 贡觉县| 长子县| 上杭县| 诏安县| 安新县| 烟台市| 敦煌市| 荆门市| 高阳县| 城固县| 渝北区| 云南省| 龙胜| 高要市| 肇州县| 周至县| 伊金霍洛旗| 响水县|