有没有办法通过代理服务器来收集连接到您的网站的客户端的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