接入高防後(hòu)如何讓服務器程序獲取用戶真實訪問IP
很多時候,我們的網站并不是簡單的從用戶的浏覽器直達你的服務器的途徑, 考慮到網站的訪問速度、安全等屬性,我們中間可能(néng)會加入高防IP、高防CDN,或者是接入了反向(xiàng)代理模式下的其他的安全産品等。
以網站www.yunzhidian.com接入高防爲例,它的流量途徑可能(néng)是:
普通用戶浏覽器 —–> 高防(防DDOS、 CC、Web攻擊) ——> 源站服務器(PHP 程序部署在這(zhè)裡(lǐ),iptables, nginx 安全配置)
那麼(me)問題來了,經(jīng)過(guò)這(zhè)麼(me)多層加速,服務器如何才能(néng)得到發(fā)起(qǐ)請求的真實客戶端IP呢?
當一個透明代理服務器(如高防)把用戶的請求轉到後(hòu)面(miàn)服務器的時候,如果開(kāi)啓了www.yunzhidian.com的網站防護配置,那麼(me)高防會在 Http 的頭中加入一個記錄
X-Forwarded-For : 用戶真實IP, 高防代理IP
如果中間經(jīng)曆了不止一個代理服務器,如經(jīng)過(guò)了CDN等等,那麼(me)X-Forwarded-For可能(néng)會爲以下的形式:
X-Forwarded-For : 用戶IP, 代理服務器1-IP, 代理服務器2-IP, 代理服務器3-IP, ….
我們可以看到經(jīng)過(guò)多層代理後(hòu), 請求用戶的真實IP在第一個位置, 後(hòu)面(miàn)會跟一串中間代理服務器的IP地址,從這(zhè)裡(lǐ)取到用戶真實的IP地址,針對(duì)這(zhè)個 IP 地址做限制就可以了。那麼(me)如何獲取X-Forwarded-For的内容?
常用的服務獲取X-Forwarded-For字段内容可通過(guò)如下方式:
ASP:
Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
ASP.NET(C#):
Request.ServerVariables[“HTTP_X_FORWARDED_FOR”]
PHP:
$_SERVER[“HTTP_X_FORWARDED_FOR”]
JSP:
request.getHeader(“HTTP_X_FORWARDED_FOR”)
在您獲取到X-Forwarded-For的相關内容後(hòu),那麼(me)以“,”作爲區分符截取其中的第一個IP地址即可。