В случае, если WordPress живет на бекенд-сервере, например за акселератором nginx
, при настройках по-умолчанию комментарии будут содержать вместо IP отправителя IP фронтенда:
From: [email protected] Fri, Nov 21, 2008 at 7:59 AM To: [email protected] Новый комментарий к записи #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
и некоторых других.
Решим задачу так, чтобы:
- не трогать код WordPress;
- это работало во всех наших скриптах.
Для этого воспользуемся фичей php autoprepepend (файл, который добавляется и исполняется перед каждым php-скриптом). Скрипт (автор Grant Burton), кладем в любое место сайта:
autoprepend.inc.php
:
/* By Grant Burton @ BURTONTECH.COM (11-30-2008): IP-Proxy-Cluster Fix */ function checkIP($ip) { ); foreach ($private_ips as $r) { } return true; } else { return false; } } function determineIP() { if (checkIP($_SERVER["HTTP_CLIENT_IP"])) { return $_SERVER["HTTP_CLIENT_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 комментатора.