摘要:總結在作為反向代理的架構中,的其他語言也是類似的名稱拿到的將會是代理的地址。本意就是遠程的地址,是代理層,轉發請求到,獲取到的遠程地址實際上是反向代理服務器,這是符合協議規則的。
nginx反向代理后,在應用中取得的ip都是反向代理服務器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,需要在nginx反向代理配置中添加一些配置信息,目的將客戶端的真實ip和域名傳遞到應用程序中。
①:php獲取REMOTE_ADDR就是這樣一個情況(內網地址)。
②:獲取的是攻擊者偽造的ip地址。攻擊者可以隨便偽造一個頭部信息,隨便填寫一個ip放到頭部發過來,php獲取到HTTP_CLIENT_IP就是這樣一個情況。偽造的ip,導致我們數據庫存儲是假的ip,無從真實去判斷攻擊者的來源。比如批量注冊帳號的注冊ip,登錄的ip等。
配置如下:
location ~* .(jpg|png|gif)$ { proxy_set_header X-Forwarded-For $remote_addr; #proxy_pass http://.... } location ~ .php$ { proxy_set_header X-Forwarded-For $remote_addr; #proxy_pass http://.... }
PHP代碼:
function getIP() { $ip = "unknown"; if (getenv("HTTP_X_FORWARDED_FOR")) { //這個提到最前面,作為優先級,nginx代理會獲取到用戶真實ip,發在這個環境變量上,必須要nginx配置這個環境變量HTTP_X_FORWARDED_FOR $ip = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("REMOTE_ADDR")) { //在nginx作為反向代理的架構中,使用REMOTE_ADDR拿到的將會是反向代理的的ip,即拿到是nginx服務器的ip地址。往往表現是一個內網ip。 $ip = getenv("REMOTE_ADDR"); } else if ($_SERVER["REMOTE_ADDR"]) { $ip = $_SERVER["REMOTE_ADDR"]; } else if (getenv("HTTP_CLIENT_IP")) { //HTTP_CLIENT_IP攻擊者可以偽造一個這樣的頭部信息,導致獲取的是攻擊者隨意設置的ip地址。 $ip = getenv("HTTP_CLIENT_IP"); } return $ip; }
總結
在nginx作為反向代理的架構中,php的REMOTE_ADDR(其他語言也是類似的名稱)拿到的將會是nginx代理的ip地址。拿不到用戶的真實ip,拿到是nginx反向代理服務器地址。
REMOTE_ADDR本意就是遠程的地址,nginx是代理層,轉發請求到php,php獲取到的遠程地址實際上是nginx反向代理服務器ip,這是符合協議規則的。
但是,可以讓nginx幫助我們拿到用戶的真實ip,寫到一個環境變量中,然后轉發給我們,只要按照某個約定的名稱即可,比如約定名稱為HTTP_X_FORWARD_FOR(也可以約定其他名稱,關鍵看nginx中配置,可以全公司考慮統一)。
nginx配置類似于這樣:
fastcgi_param HTTP_X_FORWARD_FOR $remote_addr;
上一句的目的是,將HTTP_X_FORWARD_FOR的值設置為$remote_addr的值。也就是將用戶真實的ip(或用戶使用代理的ip)放到HTTP_X_FORWARD_FOR中去。
$remote_addr是nginx的內置變量,這個變量它得到是用戶真實的ip地址(用戶使用了代理,則就是代理的ip地址)。
于是在php端通過getenv("HTTP_X_FORWARDED_FOR")就可以獲取到nginx傳遞過來的值,是用戶真實的ip地址。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39780.html
摘要:總結在作為反向代理的架構中,的其他語言也是類似的名稱拿到的將會是代理的地址。本意就是遠程的地址,是代理層,轉發請求到,獲取到的遠程地址實際上是反向代理服務器,這是符合協議規則的。 nginx反向代理后,在應用中取得的ip都是反向代理服務器的ip,取得的域名也是反向代理配置的url的域名,解決該問題,需要在nginx反向代理配置中添加一些配置信息,目的將客戶端的真實ip和域名傳遞到應用程...
摘要:它是一個高性能的和反向代理服務器,同時也可以作為的代理服務器。如果相對域名或參數字符串起作用,可以使用全局變量匹配,也可以使用反向代理。 nginx是什么? nginx是俄羅斯人 Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的一個十分輕量級的HTTP服務器。它是一個高性能的HTTP和反向代理服務器,同時也可以作為IMAP/POP3/SMTP的代理服務器。ngi...
摘要:配置文件學習筆記定義運行的用戶和用戶組進程數,建議設置為等于總核心數全局錯誤日志定義類型,進程文件指定進程可以打開的最大描述符數目工作模式與連接數上限這個指令是指當一個進程打開的最多文件描述符數目,理論值應該是最多打開文件數與進程數相除, Nginx配置文件學習筆記 定義Nginx運行的用戶和用戶組 user nginx; Nginx進程數,建議設置為等于CPU總核心數 worker...
摘要:配置文件學習筆記定義運行的用戶和用戶組進程數,建議設置為等于總核心數全局錯誤日志定義類型,進程文件指定進程可以打開的最大描述符數目工作模式與連接數上限這個指令是指當一個進程打開的最多文件描述符數目,理論值應該是最多打開文件數與進程數相除, Nginx配置文件學習筆記 定義Nginx運行的用戶和用戶組 user nginx; Nginx進程數,建議設置為等于CPU總核心數 worker...
閱讀 2672·2021-11-18 10:02
閱讀 3402·2021-09-28 09:35
閱讀 2586·2021-09-22 15:12
閱讀 741·2021-09-22 15:08
閱讀 3071·2021-09-07 09:58
閱讀 3464·2021-08-23 09:42
閱讀 725·2019-08-30 12:53
閱讀 2072·2019-08-29 13:51