WordPress бэкенд: устанавливаем правильный REMOTE_ADDR для комментариев

В случае, если WordPress живет на бекенд-сервере, например за акселератором nginx, при настройках по-умолчанию комментарии будут содержать вместо IP отправителя IP фронтенда:

From: wordpress@shatlovsky.ru              Fri, Nov 21, 2008 at 7:59 AM
To: shatlovsky@gmail.com
Новый комментарий к записи #22 "Макросы RCS" ожидает одобрения

http://shatlovsky.ru/blog/2008/10/13/makrosy-rcs/

Автор : evikalley (IP: 10.1.0.1 , 10.1.0.1)
E-mail: 
URL   : http://
Whois  : http://ws.arin.net/cgi-bin/whois.pl?queryinput=10.1.0.1
Комментарий:
Спасибо! Буду теперь заходить на этот блог каждый день!

Видим, что вместо IP спамера записан IP фронтенд-сервера (10.1.0.1).

Решение этой проблемы заключается в подстановке корректного адреса в переменную $_SERVER["REMOTE_ADDR"] (в понятиях PHP, на котором написан WordPress). Корректный адрес может быть в переменных HTTP_X_FORWARDED_FOR, X_REAL_IP и некоторых других.

Решим задачу так, чтобы:

  1. не трогать код WordPress;
  2. это работало во всех наших скриптах.

Для этого воспользуемся фичей php autoprepepend (файл, который добавляется и исполняется перед каждым php-скриптом). Скрипт (автор Grant Burton), кладем в любое место сайта:

autoprepend.inc.php:

/* By Grant Burton @ BURTONTECH.COM (11-30-2008): IP-Proxy-Cluster Fix */
function checkIP($ip) {
	if (!empty($ip) && ip2long($ip)!=-1 && ip2long($ip)!=false) {
		$private_ips = array (
		array('0.0.0.0','2.255.255.255'),
		array('10.0.0.0','10.255.255.255'),
		array('127.0.0.0','127.255.255.255'),
		array('169.254.0.0','169.254.255.255'),
		array('172.16.0.0','172.31.255.255'),
		array('192.0.2.0','192.0.2.255'),
		array('192.168.0.0','192.168.255.255'),
		array('255.255.255.0','255.255.255.255')
		);
 
		foreach ($private_ips as $r) {
			$min = ip2long($r[0]);
			$max = ip2long($r[1]);
			if ((ip2long($ip) >= $min) && (ip2long($ip) <= $max)) return false;
		}
		return true;
	} else {
		return false;
	}
}
 
function determineIP() {
	if (checkIP($_SERVER["HTTP_CLIENT_IP"])) {
		return $_SERVER["HTTP_CLIENT_IP"];
	}
	foreach (explode(",",$_SERVER["HTTP_X_FORWARDED_FOR"]) as $ip) {
		if (checkIP(trim($ip))) {
			return $ip;
		}
	}
	if (checkIP($_SERVER["HTTP_X_FORWARDED"])) {
		return $_SERVER["HTTP_X_FORWARDED"];
	} elseif (checkIP($_SERVER["HTTP_X_CLUSTER_CLIENT_IP"])) {
		return $_SERVER["HTTP_X_CLUSTER_CLIENT_IP"];
	} elseif (checkIP($_SERVER["HTTP_FORWARDED_FOR"])) {
		return $_SERVER["HTTP_FORWARDED_FOR"];
	} elseif (checkIP($_SERVER["HTTP_FORWARDED"])) {
		return $_SERVER["HTTP_FORWARDED"];
	} else {
		return $_SERVER["REMOTE_ADDR"];
	}
}
//Override server variable for WordPress comments
$_SERVER["REMOTE_ADDR"] = determineIP();
 

Далее редактируем .htaccess в корне сайта, добавляем туда ссылку на этот скрипт:

php_value auto_prepend_file /home/username/htdocs/autoprepend.inc.php

(путь надо скорректировать в соответствии с вашими настройками).

Готово! Теперь WordPress видит правильный IP комментатора.

Комментарии (5) на “WordPress бэкенд: устанавливаем правильный REMOTE_ADDR для комментариев”

  1. Александр:

    Спасибо, попробую. А то это пока единственное неудобство, которое я обнаружил после установки nginx

  2. WordPress, nginx и IP-адреса в e-mail » Записки Димокса:

    [...] Решение есть, нашлось быстро – “WordPress бэкенд: устанавливаем правильный REMOTE_ADDR для комм

  3. Lexian:

    Когда возникает подобное без nginx, то помогает код в wp-config после всех значений define и перед ?>

    if ($_SERVER[\HTTP_X_FORWARDED_FOR\]) {
    if ($_SERVER[\HTTP_CLIENT_IP\]) {
    $proxy = $_SERVER[\HTTP_CLIENT_IP\];
    } else {
    $proxy = $_SERVER[\REMOTE_ADDR\];
    }
    $ip = $_SERVER[\HTTP_X_FORWARDED_FOR\];
    } else {
    if ($_SERVER[\HTTP_CLIENT_IP\]) {
    $ip = $_SERVER[\HTTP_CLIENT_IP\];
    } else {
    $ip = $_SERVER[\REMOTE_ADDR\];
    }
    }
    $_SERVER['REMOTE_ADDR'] = $ip;

  4. Сервер:

    Да, только тут http://www.phpfaq.ru/ip#notes пишут что все что HTTP легко подделать. А есть ли какое-то решение чтобы прямо на сервере IP сервера в REMOTE_ADDR вписать? Может кто знает?

  5. nrg:

    ключевое слово – mod_rpaf

Оставить комментарий