什麼是remote_addr
remote_addr表明客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那麼網站的web服務器(Nginx,Apache等)就會把remote_addr設爲你的機器IP,若是你用了某個代理,那麼你的瀏覽器會先訪問這個代理,而後再由這個代理轉發到網站,這樣web服務器就會把remote_addr設爲這臺代理機器的IP。
什麼是x_forwarded_for
正如上面所述,當你使用了代理時,web服務器就不知道你的真實IP了,爲了不這個狀況,代理服務器一般會增長一個叫作x_forwarded_for的頭信息,把鏈接它的客戶端IP(即你的上網機器IP)加到這個頭信息裏,這樣就能保證網站的web服務器能獲取到真實IP
一、使用CDN自定義IP頭來獲取
像cloudflare會增長一個"HTTP_CF_CONNECTING_IP"的http頭
在php中可使用$_SERVER["HTTP_CF_CONNECTING_IP"]來獲取值
二、經過HTTP_X_FORWARDED_FOR獲取IP地址
通常狀況下CDN服務器都會傳送HTTP_X_FORWARDED_FOR頭,這是一個用逗號分隔的ip串,截取字符串第一個不爲unkown的IP做爲用戶真實IP地址
在php中可使用$_SERVER["HTTP_CF_CONNECTING_IP"]來獲取值,獲取第一個值爲真實ip
三、使用nginx自帶模塊realip獲取用戶IP地址
首先須要nginx有realip模塊
配置信息以下
server{
set_real_ip_from 192.168.50.0/24;
set_real_ip_from 61.22.22.22;
set_real_ip_from 121.207.33.33;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;//ip串
real_ip_recursive on;
...
}
參數解釋:
set_real_ip_from //真實服務器上一級代理的IP地址或者IP段,能夠寫多行
real_ip_header //從哪一個header頭檢索出要的IP地址
real_ip_recursive//遞歸排除IP地址,ip串從右到左開始排除set_real_ip_from裏面出現的IP,若是出現了未出現這些ip段的IP,那麼這個IP將被認爲是用戶的IP
而後賦值到remote_addr變量
三種在CDN環境下獲取用戶IP方法總結
一、CDN自定義header頭
優勢:獲取到最真實的用戶IP地址,用戶絕對不可能假裝IP
缺點:須要CDN廠商提供
二、獲取x-forwarded-for頭
優勢:能夠獲取到用戶的IP地址
缺點:程序須要改動,以及用戶IP有多是假裝的
三、使用realip獲取
優勢:程序不須要改動,直接使用remote_addr便可獲取IP地址
缺點:ip地址有可能被假裝,並且須要知道全部CDN節點的ip地址或者ip段