接入高防后如何讓服務(wù)器程序獲取用戶真實訪問IP
很多時候,我們的網(wǎng)站并不是簡單的從用戶的瀏覽器直達(dá)你的服務(wù)器的途徑, 考慮到網(wǎng)站的訪問速度、安全等屬性,我們中間可能會加入高防IP、高防CDN,或者是接入了反向代理模式下的其他的安全產(chǎn)品等。
以網(wǎng)站fenghexin.com接入高防為例,它的流量途徑可能是:?
普通用戶瀏覽器??—–>??高防(防DDOS、 CC、Web攻擊) ——>??源站服務(wù)器(PHP 程序部署在這里,iptables, nginx 安全配置)
那么問題來了,經(jīng)過這么多層加速,服務(wù)器如何才能得到發(fā)起請求的真實客戶端IP呢?
當(dāng)一個透明代理服務(wù)器(如高防)把用戶的請求轉(zhuǎn)到后面服務(wù)器的時候,如果開啟了fenghexin.com的網(wǎng)站防護(hù)配置,那么高防會在 Http 的頭中加入一個記錄
X-Forwarded-For :??用戶真實IP, 高防代理IP
如果中間經(jīng)歷了不止一個代理服務(wù)器,如經(jīng)過了CDN等等,那么X-Forwarded-For可能會為以下的形式:
X-Forwarded-For :??用戶IP, 代理服務(wù)器1-IP, 代理服務(wù)器2-IP, 代理服務(wù)器3-IP, ….
我們可以看到經(jīng)過多層代理后, 請求用戶的真實IP在第一個位置, 后面會跟一串中間代理服務(wù)器的IP地址,從這里取到用戶真實的IP地址,針對這個 IP 地址做限制就可以了。那么如何獲取X-Forwarded-For的內(nèi)容?
常用的服務(wù)獲取X-Forwarded-For字段內(nèi)容可通過如下方式:
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的相關(guān)內(nèi)容后,那么以“,”作為區(qū)分符截取其中的第一個IP地址即可。