有沒有辦法通過代理服務器來收集連接到您的網站的客戶端的IP地址?查找通過代理連接的客戶端的IP地址
整個設置是一個內部局域網,通過系統管理員,我也可以控制代理機器。我使用PHP5作爲網站服務器端。
我在PHP中試過$_SERVER['REMOTE_ADDR']
,但是這個變量只存儲了代理的IP地址。
任何想法?
有沒有辦法通過代理服務器來收集連接到您的網站的客戶端的IP地址?查找通過代理連接的客戶端的IP地址
整個設置是一個內部局域網,通過系統管理員,我也可以控制代理機器。我使用PHP5作爲網站服務器端。
我在PHP中試過$_SERVER['REMOTE_ADDR']
,但是這個變量只存儲了代理的IP地址。
任何想法?
標準溶液(在PHP)是:
if ($_SERVER['HTTP_X_FORWARDED_FOR']){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip = $_SERVER['REMOTE_ADDR'];
}
但作爲第一個答案說,這一切都取決於實際被設置的頭。
這取決於代理。一些代理添加了一個標題,該標題給出了原始IP地址X-Forwarded-For標題,但是考慮到大多數公司使用代理來隱藏罕見的內部網絡結構。如果是這種情況,那麼你不會輕易做到這一點。
如果您可以控制代理,那麼應該閱讀代理文檔以瞭解如何添加該標頭。
+1正確,並很好地解釋。 – karim79 2009-08-14 06:55:10
PHP是否將XFF頭解析爲服務器變量? – 2009-08-14 08:06:11
X-Forwarded-For
是獲取客戶端IP地址的唯一途徑。檢查是否有辦法在您的代理中啓用該功能。
在某些代理服務器上,它提供瞭如何處理現有XFF標頭(當請求經過多個代理服務器時)的選項。這裏是你需要考慮的,
此代碼可用於獲取通過代理連接的客戶端的IP地址。
public static String getClientIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
但它只在代理透明時才檢測到。
下面是在HTTP代理的信息:
沒有使用任何代理服務器:
request.getRemoteAddr()
=客戶端request.getHeader("HTTP_X_FORWARDED_FOR")
的IP地址= No值或無顯示使用Transparent Pro謝胱:客戶
正常使用匿名代理
HTTP_X_FORWARDED_FOR
=真實IP地址:
request.getRemoteAddr()
=代理服務器的IP地址HTTP_X_FORWARDED_FOR
=代理服務器的IP地址嗯..這是Java。問題的標籤爲PHP。 – StackOverflowed 2017-07-14 18:48:23
其實,這不起作用:而不是'HTTP_X_FORWARD_FOR',它是'HTTP_X_FORWARDED_FOR' – lauhub 2011-11-21 10:40:02