php 使用IP2Location限制指定的国家访问实现

1.使用composer安装composer require ip2location/ip2location-php

2.引用文件,最重要的路径引入的时候一定要正确

3.一开始文件放在项目的入口文件index.php调试,但是遇到了许多的问题,根本原因就是跟thinPHP里面的自动加载机制有冲突,所以需要新加一个PHP的文件,在这个新建的PHP文件写,然后在入口文件引入就可以了。

复制代码
$basePath = dirname(dirname(__DIR__));//获取的目录是E:\Wampee-3.1.0-beta-3.5\www\1688order
$base_path = $basePath . '/vendor/ip2location/ip2location-php/IP2Location.php';
$bin_path = $basePath . '/vendor/ip2location/ip2location-php/databases/IP2LOCATION-LITE-DB1.BIN';


require_once $base_path;

$db = new \IP2Location\Database( $bin_path, \IP2Location\Database::FILE_IO);

// 2. 获取客户端 IP
$client_ip = getClientIP();
if ($client_ip == '127.0.0.1'){
    return true;
}

$records = $db->lookup($client_ip, \IP2Location\Database::ALL);

$country_code = $records['countryCode'] ?? null;

// 1. 允许访问的国家代码列表
$allowed_countries = ['US', 'CA', 'BR', 'FR', 'GB', 'IT', 'ES', 'DE','CN','PT','AU','BE','NL','MX','NG'];

// 5. 判断是否允许访问
if (!in_array($country_code, $allowed_countries, true)) {
    // 拦截访问
    header('HTTP/1.1 403 Forbidden');
    echo 'Access denied for your region.';
    exit;
}
// 以下是正常业务逻辑
// =====================
//echo "Welcome! Country: {$country_code}";

// 获取真实客户端 IP 的函数
function getClientIP()
{
    if (!empty($_SERVER['HTTP_CF_CONNECTING_IP'])) {
        return $_SERVER['HTTP_CF_CONNECTING_IP']; // Cloudflare
    }
    if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
        return $_SERVER['HTTP_X_REAL_IP'];
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        return trim($ips[0]);
    }
    return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}
相关推荐
死磕音视频4 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
北京中科新远科技5 小时前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
顽疲7 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
程序喵大人9 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器
微三云 - 廖会灵 (私域系统开发)9 小时前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
学逆向的9 小时前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
霸道流氓气质10 小时前
AgentFlow 入门与实战:Task-Based 并发、EWMA 动态调度与四道门禁的 Java 生产级编排
java·开发语言
LZ_66610 小时前
php代码执行3(难)
php
释厄62311 小时前
错误无误公理——错误正确本同源都迭代定律——逆转有价值
android·开发语言·kotlin