nginx proxy_set_header設置,自定義header


  • 在實際應用中,我們可能需要獲取用戶的ip地址,比如做異地登陸的判斷,或者統計ip訪問次數等,通常情況下我們使用request.getRemoteAddr()就可以獲取到客戶端ip,但是當我們使用了nginx作為反向代理后,使用request.getRemoteAddr()獲取到的就一直是nginx服務器的ip的地址,那這時應該怎么辦?

   

  • 而且有些場景做了一些客戶端瀏覽器url的判斷,比如,瀏覽器輸入baidu.com是可以訪問到百度的,但是輸入!@#*.com有可能也是可以訪問到百度,但是百度內部並不希望以這種方式訪問(或者防止一些網絡攻擊),這時候應該怎么辦?

   

其實nginx允許重新定義或者添加發往后端服務器的請求頭。value可以包含文本、變量或者它們的組合。

   

默認情況下,有兩個請求頭會被重新定義:

proxy_set_header Host $proxy_host; //默認會將后端服務器的HOST填寫進去

proxy_set_header Connection close;

   

   

我們可以通過設置nginx配置去調整轉發報文的頭部:

   

  • proxy_set_header X-real-ip $remote_addr;

    其中這個X-real-ip是一個自定義的變量名,名字可以隨意取,這樣做完之后,用戶的真實ip就被放在X-real-ip這個變量里了,然后,在web端可以這樣獲取:

       

    request.getHeader("X-real-ip")

       

  • proxy_set_header X-Forwarded-For $remote_addr;

    同上。

    真實的顯示出客戶端原始ip。(nginx更多使用這條配置,X-Forwarded-For為默認字段,以下介紹均為默認字段)

       

  • proxy_set_header Host $http_host;

    如果想獲取客戶端訪問的頭部,可以這樣來設置。

    但是,如果客戶端請求頭中沒有攜帶這個頭部,那么傳遞到后端服務器的請求也不含這個頭部。

       

  • proxy_set_header Host $host;

    這個配置相當於上面配置的增強。

    它的值在請求包含"Host"請求頭時為"Host"字段的值,在請求未攜帶"Host"請求頭時為虛擬主機的主域名。

       

  • proxy_set_header Host $host:$proxy_port;

    服務器名和后端服務器的端口(訪問端口)一起傳送。

       

  • proxy_set_header <<<*>>> "";

    請求頭的值為空,請求頭將不會傳送給后端服務器。

       

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    在默認情況下經過proxy轉發的請求,在后端看來遠程地址都是proxy端的ip

    添加這條配置之后:

    意思是增加一個$proxy_add_x_forwarded_forX-Forwarded-For里去,注意是增加,而不是覆蓋,當然由於默認的X-Forwarded-For值是空的,所以我們總感覺X-Forwarded-For的值就等於$proxy_add_x_forwarded_for的值,實際上當你搭建兩台nginx在不同的ip上,並且都使用了這段配置,那你會發現在web服務器端通過request.getHeader("X-Forwarded-For")獲得的將會是客戶端ip第一台nginxip

       

    在第一台nginx,使用

       

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       

    現在的$proxy_add_x_forwarded_for變量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用戶的ip,於是賦值以后,X-Forwarded-For變量的值就是用戶的真實的ip地址了。

       

    到了第二台nginx,也使用

       

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

       

    現在的$proxy_add_x_forwarded_for變量,

    X-Forwarded-For部分包含的是用戶的真實ip

    $remote_addr部分的值是上一台nginxip地址,

    於是通過這個賦值以后現在的X-Forwarded-For的值就變成了"用戶的真實ip,第一台nginxip"。

       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM