本帖最后由 netroby 于 2011-4-28 10:32 编辑
Discuz X 获取IP的方式不完全,导致在启用proxy 之后,无法正确获取IP, 应该加上一个HTTP_X_REAL_IP.
Discuz X1.5 X2.0都存在这个问题
- function _get_client_ip() {
- $ip = $_SERVER['REMOTE_ADDR'];
- if (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
- $ip = $_SERVER['HTTP_CLIENT_IP'];
- } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR']) AND preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
- foreach ($matches[0] AS $xip) {
- if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
- $ip = $xip;
- break;
- }
- }
- } elseif (isset($_SERVER["HTTP_X_REAL_IP"])) {
- $ip = $_SERVER['HTTP_X_REAL_IP'];
- }
- return $ip;
- }
复制代码 elseif (isset($_SERVER["HTTP_X_REAL_IP"])) {
$ip = $_SERVER['HTTP_X_REAL_IP'];
} |