Nginx/Apache反向代理后,在应用中取得的IP都是反向代理服务器的IP,取得的域名也是反向代理配置的URL的域名,解决该问题,需要在Nginx/Apache的反向代理配置中添加一些配置信息,目的将客户端的真实IP和域名传递到应用程序中。
几种获取IP的方法和说明
-
没有使用代理服务器的PHP获取客户端IP情况: REMOTE_ADDR = 客户端IP HTTP_X_FORWARDED_FOR = 没数值或不显示
-
用户使用代理或者服务器反向代理(例如Nginx等反向代理)
REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 客户端真实 IP
这类代理服务器还是将客户端真实的IP发送给了访问对象,无法达到隐藏真实身份的目的。 -
使用普通匿名代理服务器的PHP获取客户端IP情况:Anonymous Proxies REMOTE_ADDR = 最后一个代理服务器 IP
HTTP_X_FORWARDED_FOR = 代理服务器 IP
这种情况下隐藏了客户端的真实IP,但是向访问对象透露了客户端是使用代理服务器访问它们的。
PHP实现代码如下:
```
/*** 获取客户端真实ip
* @return IP
/
public static function getClientIP(){
$ip = "unknown";
/*
* 访问时用localhost访问的,读出来的是“::1”是正常情况。
* ::1说明开启了ipv6支持,这是ipv6下的本地回环地址的表示。
* 使用ip地址访问或者关闭ipv6支持都可以不显示这个。
* */
if (isset($_SERVER)) {
if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
}
elseif (isset($_SERVER["HTTP_CLIENT_ip"])) {
$ip = $_SERVER["HTTP_CLIENT_ip"];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_CLIENT_ip')) {
$ip = getenv('HTTP_CLIENT_ip');
} else {
$ip = getenv('REMOTE_ADDR');
}
}
if(trim($ip)=="::1"){
$ip="127.0.0.1";
}
return $ip;
}
``` 打开浏览器,检查是否已获取成功。