Pbootcms屏蔽指定地区IP访问

    Pbootcms屏蔽指定地区IP访问,代码如下;

    <?php
    /**
     * @copyright (C)2016-2099 Hnaoyun Inc.
     * @author XingMeng
     * @email hnxsh@foxmail.com
     * @date 2016年11月5日
     *  用户前端入口文件
     */
    
    // ========== IP地理位置限制检查 ==========
    // 获取真实客户端IP地址
    function getRealClientIP() {
        $ip = '';
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $ip = trim($ips[0]);
        } elseif (isset($_SERVER['HTTP_X_REAL_IP']) && !empty($_SERVER['HTTP_X_REAL_IP'])) {
            $ip = $_SERVER['HTTP_X_REAL_IP'];
        } elseif (isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
        
        // 验证IP格式
        if (!filter_var($ip, FILTER_VALIDATE_IP)) {
            $ip = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
        }
        
        return $ip;
    }
    
    // 搜索引擎核心标识(精简版)
    $search_engines = [
        // Google
        'Googlebot',
        
        // Bing
        'Bingbot',
        'MSNBot',
        
        // Yahoo
        'Slurp',
        
        // DuckDuckGo
        'DuckDuckBot',
        
        // 百度
        'Baiduspider',
        
        // Yandex
        'YandexBot',
        
        // 360搜索
        '360Spider',
        
        // 神马搜索
        'YisouSpider',
        
        // 头条搜索
        'Bytespider',
    ];
    
    // 获取User-Agent
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    
    // 检查是否为搜索引擎
    $is_search_engine = false;
    if (!empty($user_agent)) {
        foreach ($search_engines as $engine) {
            if (stripos($user_agent, $engine) !== false) {
                $is_search_engine = true;
                break;
            }
        }
    }
    
    // 白名单IP(用于测试或管理,可以添加您的IP)
    $whitelist_ips = [
        // '127.0.0.1',  // 本地测试
         '101.30.42.207',  // 添加您的IP到这里
    ];
    
    // 获取客户端IP
    $client_ip = getRealClientIP();
    
    // 定义允许的国家代码列表(根据您的需求修改)
    $allowed_countries = ['PE', 'AR']; // 秘鲁和阿根廷
    
    // 检查是否在白名单中
    if (!in_array($client_ip, $whitelist_ips) && !$is_search_engine) {
        // 如果不是搜索引擎,检查地理位置
        // 使用免费API检查IP地理位置
        $geo_api_url = "http://ip-api.com/json/{$client_ip}?fields=status,countryCode,message";
        
        // 设置超时时间(3秒)
        $context = stream_context_create([
            'http' => [
                'timeout' => 3,
                'user_agent' => 'Mozilla/5.0'
            ]
        ]);
        
        $geo_data = @file_get_contents($geo_api_url, false, $context);
        
        if ($geo_data) {
            $geo_info = json_decode($geo_data, true);
            
            // 检查API返回状态和国家代码
            if (isset($geo_info['status']) && $geo_info['status'] === 'success') {
                $country_code = $geo_info['countryCode'] ?? '';
                
                // 如果不在允许的国家列表中,拒绝访问
                if (!empty($country_code) && !in_array($country_code, $allowed_countries)) {
                    http_response_code(403);
                    header('Content-Type: text/html; charset=utf-8');
                    die('<!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
        <title>访问被拒绝</title>
        <style>
            * { 
                box-sizing: border-box; 
                margin: 0; 
                padding: 0; 
            }
            body { 
                font-family: Arial, "Microsoft YaHei", sans-serif;
                background: #f5f5f5;
                min-height: 100vh;
                display: flex;
                align-items: center;
                justify-content: center;
                padding: 16px;
            }
            .error-box { 
                width: 100%;
                max-width: 480px;
                background: #fff;
                padding: 32px 24px;
                border-radius: 12px;
                box-shadow: 0 2px 10px rgba(0,0,0,0.1);
                text-align: center;
            }
            h1 { 
                color: #d32f2f; 
                margin-bottom: 16px; 
                font-size: 22px;
                font-weight: 600;
            }
            p { 
                color: #666; 
                line-height: 1.7; 
                font-size: 14px;
                margin-bottom: 6px;
            }
            @media (min-width: 768px) {
                .error-box { 
                    padding: 40px 32px; 
                }
                h1 { 
                    font-size: 26px; 
                }
                p { 
                    font-size: 15px; 
                }
            }
        </style>
    </head>
    <body>
        <div>
            <h1>访问被拒绝</h1>
            <p>抱歉,此网站仅限指定地区访问。</p>
            <p>Sorry, this website is only accessible in designated regions.</p>
        </div>
    </body>
    </html>');
                }
            }
        }
        // 如果API请求失败,可以选择允许访问(避免API故障导致网站无法访问)
        // 或者拒绝访问(更安全),根据需求选择:
        // else {
        //     http_response_code(403);
        //     die('无法验证地理位置,访问被拒绝。');
        // }
    }
    // ========== IP限制检查结束 ==========
    
    // 定义为入口文件
    define('IS_INDEX', true);
    
    // 入口文件地址绑定
    define('URL_BIND', 'home');
    
    // PHP版本检测
    if (version_compare(phpversion(),'7.0.0','<')) {
        header('Content-Type:text/html; charset=utf-8');
        exit('您服务器PHP的版本太低,程序要求PHP版本不小于7.0');
    }
    
    // 引用内核启动文件
    require dirname(__FILE__) . '/core/start.php';