前言说明

请注意,这段代码中的高德地图API密钥,您需也可以替换自己API密钥才能正常使用获取用户到IP,当然你可以使用其他获取IP的API接口来完成获取地理位置,注册《高德地图开发者平台》获取你的秘钥。

完整代码

<?php
/*
 * 禁止指定省份访问网站
 * author:360模板吧
 * url:www.360mb.net
 */

define('AMAP_API_KEY', '填写你到秘钥');//填写你到秘钥

$forbiddenProvinces = ['陕西', '山西', '广东'];//填写你需要禁止到省份

try {
    $ip = getClientIP();
    if (!isValidIP($ip)) {
        throw new Exception("Invalid IP address");
    }
    $ipData = curlIP($ip);
    $ipInfo = json_decode($ipData, true);
    $ipProvince = $ipInfo['province'];
    if ($ipProvince && in_array($ipProvince, $forbiddenProvinces)) {
        header("HTTP/1.1 404 Not Found");
        header("Status: 404 Not Found");
        exit();
    }
} catch (Exception $e) {
    error_log($e->getMessage(), 0);
}

function curlIP($ip)
{
    $url = "https://restapi.amap.com/v3/ip?key=" . AMAP_API_KEY . "&ip=" . $ip;
    $curl = curl_init();
    $headers = array(
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36 ",
    );
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_REFERER, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

function getClientIP()
{
    $ipKeys = [
        'HTTP_CLIENT_IP',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED_FOR',
        'HTTP_FORWARDED',
        'REMOTE_ADDR'
    ];
    foreach ($ipKeys as $key) {
        if (isset($_SERVER[$key]) && filter_var($_SERVER[$key], FILTER_VALIDATE_IP)) {
            return $_SERVER[$key];
        }
    }
    return '';
}

function isValidIP($ip)
{
    return filter_var($ip, FILTER_VALIDATE_IP);
}

 

代码解释

  1. 通过 getClientIP() 函数获取客户端的IP地址。
  2. 使用 CurlIP() 函数将IP地址发送给高德地图API,获取该IP地址所对应的地理位置信息。
  3. 将返回的地理位置信息解析成JSON格式,并提取其中的省份信息。
  4. 如果省份信息匹配到了陕西、山西或广东,则返回404错误码,禁止访问网站。
  5. 如果省份信息不匹配上述三个省份,则可以正常访问网站。
  6. getClientIP() 函数用于获取客户端的真实IP地址,会尝试从多个HTTP请求头中获取。
  7. 这段代码依赖于高德地图API来获取IP地址对应的地理位置信息。
1.使用本站下载的源码仅限于个人学习和非商业用途。
2.禁止将本站下载的源码用于搭建或支持任何违法、淫秽、暴力或侵犯他人合法权益的网站或应用。
3.使用本站下载的源码需遵守国家法律法规及相关规定,不得从事任何违法活动。
4.如若本站内容侵犯了原著者的合法权益,请联系我们进行处理。