Автор Тема: Prestashop & Cloudflare - решение проблемы определения реального IP  (Прочитано 38 раз)

11 Ноябрь 2019, 19:56:59
  • Новичок
  • *
  • Сообщений: 11
  • Репутация: +0/-0
    • Просмотр профиля
    • HandMadeSPb
Некоторое время назад завел сайт под CloudFlare, включил SSL (без проблем не обошлось, но это отдельная тема). В итоге, все отлично заработало, раздражало только, что при включении режима обслуживания сам не могу нормально смотреть фронтэнд, так как CF прячет реальный IP, и то что он прописан как служебный в Престе не дает никакого эффекта. А в перспективе (сайт пока under construction) это грозило кривой статистикой.

Гуглил запросы, содержащие в разных комбинациях слова Prestashop Clouflare IP, но ничего вразумительного не находилось. Написано в основном про какой-то мод для апача, который самим CF давно не поддерживается, да и сайт пока на shared хостинге, так что мне оно без пользы.

И вот сегодня наткнулся каким-то чудом на вот это https://docs.sucuri.net/website-firewall/troubleshooting/same-ip-for-all-users/#prestashop
Как-то сразу почуял, что это очень похоже на то что мне надо. Почесал репу, приведенный в статье код адаптировал под CF, тупо заменив
'HTTP_X_SUCURI_CLIENTIP' на 'HTTP_CF_CONNECTING_IP', получилось вот такое:
----
<?php
class Tools extends ToolsCore
{
    /**
    * Get the server variable REMOTE_ADDR, or the first ip of HTTP_X_FORWARDED_FOR (when using proxy)
    *
    * [USER=273296]@Return[/USER] string $remote_addr ip of client
    */
    public static function getRemoteAddr()
    {
        // This condition is necessary when using CloudFlare, don't remove it.
        if (isset($_SERVER['HTTP_CF_CONNECTING_IP']) AND $_SERVER['HTTP_CF_CONNECTING_IP'])
        {
            if (strpos($_SERVER['HTTP_CF_CONNECTING_IP'], ','))
            {
                $ips = explode(',', $_SERVER['HTTP_CF_CONNECTING_IP']);
                return $ips[0];
            }
            else
                return $_SERVER['HTTP_CF_CONNECTING_IP'];
        }
        return $_SERVER['REMOTE_ADDR'];
    }
}
----
по описанной в статье инструкции сохранил это в файл /override/classes/Tools.php и удалил /var/cashe/prod/class_index.php  (Prestashop 1.7.6.1)

Произошло чудо - оно работает :) Почему чудо - потому что я ничего в этом не понимаю )))

Решил написать сюда, с двумя целями:
1. вдруг кому-нибудь пригодится;
2. может, местные гуру что поправят-допишут в этом коде, т.к. код оригинальной function getRemoteAddr() в Престе существенно сложнее, и потом где-нибудь вылезет косяк.
Giddy