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 分钟前
Java 并发编程进阶,从线程池、锁、AQS 到并发容器与性能调优全解析
java·开发语言·jvm·spring·kafka·tomcat·maven
条tiao条12 分钟前
KMP 算法详解:告别暴力匹配,让字符串匹配 “永不回头”
开发语言·算法
干啥啥不行,秃头第一名18 分钟前
C++20概念(Concepts)入门指南
开发语言·c++·算法
2301_807367191 小时前
C++中的解释器模式变体
开发语言·c++·算法
always_TT1 小时前
C语言中的字符与字符串(char数组)
c语言·开发语言
forAllforMe2 小时前
LAN9252 从机寄存器配置--C语言举例
c语言·开发语言
weixin_537590452 小时前
《C程序设计语言》练习答案(练习1-4)
c语言·开发语言
chushiyunen2 小时前
python中的内置属性 todo
开发语言·javascript·python
麦麦鸡腿堡2 小时前
JavaWeb_请求参数,设置响应数据,分层解耦
java·开发语言·前端
2301_819414303 小时前
C++与区块链智能合约
开发语言·c++·算法