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';
}
相关推荐
a努力。16 小时前
虾皮Java面试被问:JVM Native Memory Tracking追踪堆外内存泄漏
java·开发语言·jvm·后端·python·面试
Kratzdisteln16 小时前
【Python】Flask
开发语言·python·flask
古城小栈16 小时前
Rust 并发、异步,碾碎它们
开发语言·后端·rust
Evand J16 小时前
【MATLAB代码介绍】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,MATLAB
开发语言·matlab·无人机·协同·路径·多机器人
sa1002716 小时前
基于Python的京东评论爬虫
开发语言·爬虫·python
foundbug99916 小时前
STFT在图像配准中的MATLAB实现
开发语言·matlab
ii_best16 小时前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
a31582380616 小时前
Android 大图显示策略优化显示(二)
android·java·开发语言·javascript·kotlin·glide·图片加载
月明长歌16 小时前
Java多线程线程池ThreadPoolExecutor理解总结:6 个核心参数 + 4 种拒绝策略(附完整示例)
java·开发语言