前言说明
请注意,这段代码中的高德地图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);
}
代码解释
- 通过 getClientIP() 函数获取客户端的IP地址。
- 使用 CurlIP() 函数将IP地址发送给高德地图API,获取该IP地址所对应的地理位置信息。
- 将返回的地理位置信息解析成JSON格式,并提取其中的省份信息。
- 如果省份信息匹配到了陕西、山西或广东,则返回404错误码,禁止访问网站。
- 如果省份信息不匹配上述三个省份,则可以正常访问网站。
- getClientIP() 函数用于获取客户端的真实IP地址,会尝试从多个HTTP请求头中获取。
- 这段代码依赖于高德地图API来获取IP地址对应的地理位置信息。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END