有没有办法通过代理服务器收集连接到您网站的客户端的IP地址?
整个设置是内部局域网,通过系统管理员,我也可以控制代理机器。我在网站服务器端使用PHP5。
我在PHP中尝试了$_SERVER['REMOTE_ADDR']
,但这个变量只存储了代理的IP地址。
有什么想法吗?
答案 0 :(得分:12)
这取决于代理。一些代理添加了一个标题,该标题提供了原始IP地址,即X-Forwarded-For标头,但考虑到大多数公司使用代理来隐藏罕见的内部网络结构。如果是这种情况,那么您将无法轻松完成。
如果您可以控制代理,那么就该阅读代理文档以了解如何添加该标题。
答案 1 :(得分:12)
标准解决方案(在php中)是:
if ($_SERVER['HTTP_X_FORWARDED_FOR']){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip = $_SERVER['REMOTE_ADDR'];
}
但是,第一个答案说这一切都取决于实际设置的标题。
答案 2 :(得分:1)
X-Forwarded-For
是获取客户端IP地址的唯一方法。检查是否有办法在您的代理中启用它。
在某些代理上,它为您提供了如何处理现有XFF标头的选项(当请求通过多个代理时)。以下是您需要考虑的事项,
答案 3 :(得分:-1)
此代码可用于获取通过代理连接的客户端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()
=客户端的IP地址request.getHeader("HTTP_X_FORWARDED_FOR")
=无值或无显示使用透明代理:
HTTP_X_FORWARDED_FOR
=客户端的真实IP地址使用普通匿名代理:
request.getRemoteAddr()
=代理服务器的IP地址HTTP_X_FORWARDED_FOR
=代理服务器的IP地址