迅睿框架 版主:迅睿框架研发组
虚拟系统建站如何禁止某个省份的人访问前端
类型:迅睿CMS 更新时间:2025-09-12 21:22:07 虚拟主机

我有个站是放在虚拟主机,没有宝塔管理面板在手里,如何实现禁止某一个省份的人访问前端?

回帖
  • 迅睿官方技术专家
    #1楼    迅睿官方技术专家
    2025-09-12 19:48:17
    iPhone手机 0
    这种只能在程序里面来判断它的IP,目前整个系统没有这种功能,需要开发开发思路就是根据它的访客的IP通过API接口判断它是哪个省的,然后再进行禁止操作
  • towe
    #2楼    towe
    2025-09-12 21:21:26
    Chrome 0
    迅睿官方技术专家
    我自己写了一个,写入到index.php里面了,虽然不能屏蔽手机端,但是足够用了,误伤影响不大
    <?php
    
    /**
     * 入口程序
     * 开发者可在这里定义系统目录变量
     */
    
    // IP段转换为起始和结束整数的函数
    function cidrToRange($cidr) {
        list($ip, $mask) = explode('/', $cidr);
        $ipInt = ip2long($ip);
        $maskInt = (0xFFFFFFFF << (32 - (int)$mask)) & 0xFFFFFFFF;
        $start = $ipInt & $maskInt;
        $end = $start + (~$maskInt & 0xFFFFFFFF);
        return ['start' => $start, 'end' => $end];
    }
    
    // 屏蔽北京IP段并显示升级提示
    function blockBeijingIPs() {
        // 获取访客IP
        $clientIP = $_SERVER['REMOTE_ADDR'] ?? '';
        if(empty($clientIP)) return;
        
        // 白名单IP(带备注)
        $whiteList = [
            '123.125.71.100' => '北京总部办公室',    // 北京总部日常办公
            '210.73.88.200' => '技术部测试IP',       // 技术部测试专用
            '114.247.50.50' => '高管专用IP'          // 公司高管使用
        ];
        
        // 检查是否在白名单中
        if (isset($whiteList[$clientIP])) {
            return;
        }
        
        // 将IP转换为整数便于比较
        $ipInt = ip2long($clientIP);
        if($ipInt === false) return;
        
        // 北京主要IP段(涵盖电信、联通、移动等运营商)
        $beijingCIDRs = [
            // 北京电信IP段
            '1.180.0.0/13',     // 北京电信
            '117.136.0.0/14',   // 北京电信
            '220.180.0.0/14',   // 北京电信
            '221.192.0.0/12',   // 北京电信
            
            // 北京联通IP段
            '202.96.0.0/16',    // 北京联通
            '203.86.0.0/16',    // 北京联通
            '61.135.0.0/16',    // 北京联通
            '114.247.0.0/16',   // 北京联通
            
            // 北京移动IP段
            '111.13.0.0/16',    // 北京移动
            '123.125.0.0/16',   // 北京移动
            '210.73.0.0/16',    // 北京移动
            '223.71.0.0/16',    // 北京移动
            
            // 北京其他运营商IP段
            '103.233.0.0/16',   // 北京其他
            '106.38.0.0/16',    // 北京其他
            '180.149.0.0/16',   // 北京其他
            '182.254.0.0/16'    // 北京其他
        ];
        
        // 转换为起始和结束整数范围
        $beijingIPRanges = [];
        foreach($beijingCIDRs as $cidr) {
            $beijingIPRanges[] = cidrToRange($cidr);
        }
        
        // 检查IP是否在北京IP段内
        foreach($beijingIPRanges as $range) {
            if($ipInt >= $range['start'] && $ipInt <= $range['end']) {
                // 输出升级提示页面(带简单动画)
                echo '<!DOCTYPE html>';
                echo '<html>';
                echo '<head>';
                echo '<meta charset="UTF-8">';
                echo '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
                echo '<title>网站升级中</title>';
                echo '<style>';
                echo '* { box-sizing: border-box; margin: 0; padding: 0; }';
                echo 'body { font-family: "Microsoft YaHei", sans-serif; background: #f5f7fa; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; }';
                echo '.container { width: 100%; max-width: 600px; background: white; border-radius: 12px; box-shadow: 0 5px 20px rgba(0,0,0,0.08); padding: 40px 20px; text-align: center; opacity: 0; transform: translateY(20px); animation: fadeIn 0.8s forwards 0.3s; }';
                
                // 提示图标容器样式
                echo '.icon-container { width: 100px; height: 100px; margin: 0 auto 30px; background: #e8f4fd; border-radius: 50%; display: flex; align-items: center; justify-content: center; position: relative; overflow: hidden; }';
                echo '.icon-container::after { content: ""; position: absolute; width: 120%; height: 120%; background: rgba(255,255,255,0.2); transform: rotate(45deg) translate(-120%, -50%); animation: shine 2s infinite; }';
                
                // 提示图标样式
                echo '.icon-container svg { width: 50px; height: 50px; fill: #1677ff; }';
                
                echo 'h1 { color: #1d2129; font-size: clamp(1.5rem, 5vw, 2.2rem); margin-bottom: 20px; position: relative; animation: slideUp 0.6s forwards 0.5s; opacity: 0; }';
                echo 'p { color: #4e5969; font-size: clamp(1rem, 3vw, 1.1rem); line-height: 1.6; margin-bottom: 30px; animation: slideUp 0.6s forwards 0.7s; opacity: 0; }';
                echo '.countdown { background: #f2f3f5; border-radius: 8px; padding: 25px 15px; margin: 20px 0 30px; font-size: clamp(1.2rem, 4vw, 1.6rem); color: #1677ff; font-weight: bold; animation: slideUp 0.6s forwards 0.9s; opacity: 0; }';
                
                echo '.info { font-size: clamp(0.9rem, 2vw, 1rem); color: #86909c; margin-top: 25px; animation: slideUp 0.6s forwards 1.1s; opacity: 0; }';
                echo '.dot-pulse { display: flex; justify-content: center; margin-top: 25px; gap: 8px; }';
                echo '.dot { width: 10px; height: 10px; background: #1677ff; border-radius: 50%; animation: pulse 1.5s infinite; }';
                echo '.dot:nth-child(2) { animation-delay: 0.3s; }';
                echo '.dot:nth-child(3) { animation-delay: 0.6s; }';
                
                // 动画定义
                echo '@keyframes fadeIn { to { opacity: 1; transform: translateY(0); } }';
                echo '@keyframes slideUp { to { opacity: 1; transform: translateY(0); } }';
                echo '@keyframes shine { to { transform: rotate(45deg) translate(120%, -50%); } }';
                echo '@keyframes pulse { 0%, 100% { transform: scale(0.8); opacity: 0.6; } 50% { transform: scale(1.2); opacity: 1; } }';
                
                echo '@media (max-width: 480px) {';
                echo '  .container { padding: 30px 15px; }';
                echo '  .icon-container { width: 80px; height: 80px; }';
                echo '  .icon-container svg { width: 40px; height: 40px; }';
                echo '}';
                echo '</style>';
                echo '</head>';
                echo '<body>';
                echo '<div>';
                // 提示图标
                echo '<div>';
                echo '<svg viewBox="0 0 1024 1024"><path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"/><path d="M512 288c-48.5 0-88 39.5-88 88v112c0 48.5 39.5 88 88 88s88-39.5 88-88V376c0-48.5-39.5-88-88-88zm0 160c-17.7 0-32-14.3-32-32V376c0-17.7 14.3-32 32-32s32 14.3 32 32v112c0 17.7-14.3 32-32 32z"/></svg>';
                echo '</div>';
                echo '<h1>网站系统升级中</h1>';
                echo '<p>升级期间将暂停服务!</p>';
                echo '<div>';
                echo '预计完成时间: 7天 16小时';
                echo '</div>';
                echo '<p>升级完成后将恢复正常访问,感谢您的理解</p>';
                echo '<div>';
                echo '<div></div>';
                echo '<div></div>';
                echo '<div></div>';
                echo '</div>';
                echo '</div>';
                echo '</body>';
                echo '</html>';
                exit;
            }
        }
    }
    
    // 执行IP检测
    blockBeijingIPs();
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////declare(strict_types=1);
    header('Content-Type: text/html; charset=utf-8');
    //header('X-Frame-Options: SAMEORIGIN'); // 防止被站外加入iframe中浏览
    
    // 是否是开发者模式(1开启、0关闭),上线之后建议关闭此开关
    define('IS_DEV', 0);
    
    // 是否允许后台修改模板文件(1开启、0关闭),请不要长期开启此功能
    define('IS_EDIT_TPL', 0);
    
    // 主网站目录,表示index.php文件的目录
    define('ROOTPATH', dirname(__FILE__).'/');
    
    // 当前站点目录
    !defined('WEBPATH') && define('WEBPATH', dirname(__FILE__).'/');
    
    // 缓存文件存储目录,支持自定义路径
    define('WRITEPATH', ROOTPATH.'cache/');
    
    // 系统核心程序目录,支持自定义路径和改名
    define('FCPATH', dirname(__FILE__).'/dayrui/');
    
    // 入口文件名称
    !defined('SELF') && define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
    
    // 后台管理标识
    !defined('IS_ADMIN') && define('IS_ADMIN', FALSE);
    
    // ======开始,自动进入安装界面监测代码
    if (!is_file(WRITEPATH.'install.lock') && !isset($_GET['c'])) {
        require WEBPATH.'install.php';
        exit;
    }
    // 判断环境
    if (version_compare(PHP_VERSION, '7.2.0') < 0) {
        echo "<font color=red>PHP版本必须在7.3以上,当前".PHP_VERSION."</font>";exit;
    }
    //=======结束,安装之后可以删除此段代码
    
    // 执行主程序
    require FCPATH.'Fcms/Init.php';
    满意答案
  • towe
    #3楼    towe
    2025-09-12 21:22:07
    Chrome 0
    @towe:已解决,AI协助的