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';
}
相关推荐
Rust研习社11 小时前
Rust 官方拟定 LLM 政策,防止 LLM 污染开源社区?
开发语言·后端·ai·rust·开源
muqsen11 小时前
Java 分布式相关面试题总结
java·开发语言·分布式
byzh_rc11 小时前
[DL_Net从入门到入土] 生成对抗网络 GAN
人工智能·生成对抗网络·php
fenglllle12 小时前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
froginwe1112 小时前
Scala 正则表达式
开发语言
时寒的笔记12 小时前
11期_js逆向核心案例解析(sichuan&某理财网)
开发语言·javascript·ecmascript
csbysj202012 小时前
PHP 文件:深入解析与最佳实践
开发语言
JAVA面经实录91712 小时前
Java+SpringAI企业级实战项目完整官方文档(生产终版)
java·开发语言·spring·ai编程
梵得儿SHI12 小时前
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别
java·开发语言·高并发·nio·channel·buffer·提升io效率
j_xxx404_12 小时前
Linux线程:从内存分页机制(Page Table/TLB/Page Fault)彻底读懂 Linux 线程本质
linux·运维·服务器·开发语言·c++·人工智能·ai