composer require geoip2/geoip2
被屏蔽或限制访问的美国州(截至 2025 年)
以下州因年龄验证法律而被网站屏蔽或限制访问:
- 佛罗里达州(Florida)
- 南卡罗来纳州(South Carolina)
- 阿拉巴马州(Alabama)
- 阿肯色州(Arkansas)
- 爱达荷州(Idaho)
- 印第安纳州(Indiana)
- 堪萨斯州(Kansas)
- 肯塔基州(Kentucky)
- 密西西比州(Mississippi)
- 蒙大拿州(Montana)
- 内布拉斯加州(Nebraska)
- 北卡罗来纳州(North Carolina)
- 俄克拉荷马州(Oklahoma)
- 得克萨斯州(Texas)
- 犹他州(Utah)
- 弗吉尼亚州(Virginia)
此外,乔治亚州(Georgia)的相关法律将在 2025 年 7 月生效,可能也将被屏蔽
前提条件
- 安装 MaxMind PHP SDK:bash
composer require geoip2/geoip2 - 下载 GeoLite2-City.mmdb 数据库:
- 注册并下载:https://dev.maxmind.com/geoip/geolite2-free-geolocation-data
- 放置在服务器路径,例如
/path/to/GeoLite2-City.mmdb
🧩 PHP 示例代码
php
<?php
require_once 'vendor/autoload.php';
use GeoIp2\Database\Reader;
// 初始化数据库读取器
$reader = new Reader('/path/to/GeoLite2-City.mmdb');
// 获取用户 IP 地址(注意:生产环境需处理代理或 CDN)
$ipAddress = $_SERVER['REMOTE_ADDR'];
try {
// 查询地理信息
$record = $reader->city($ipAddress);
// 获取州名(如 Texas、Utah)
$stateName = $record->subdivisions[0]->name ?? '';
// 定义需要屏蔽的州列表
$blockedStates = [
'Texas', 'Utah', 'Virginia', 'Mississippi', 'Arkansas', 'Montana',
'North Carolina', 'South Carolina', 'Alabama', 'Florida', 'Indiana',
'Kentucky', 'Oklahoma', 'Idaho', 'Kansas', 'Nebraska', 'Georgia'
];
// 判断是否需要屏蔽
if (in_array($stateName, $blockedStates)) {
// 返回 403 禁止访问
header('HTTP/1.1 403 Forbidden');
echo "Access denied due to local regulations in {$stateName}.";
exit;
}
} catch (Exception $e) {
// 如果 IP 查询失败,可选择允许或默认屏蔽
error_log("GeoIP lookup failed: " . $e->getMessage());
// 可选:默认允许或屏蔽
// exit;
}
// 正常页面逻辑继续执行
echo "Welcome to the site!";
?>
🧩 完整 PHP 示例代码
<?php
require_once 'vendor/autoload.php';
use GeoIp2\Database\Reader;
// 初始化数据库读取器
$reader = new Reader('/path/to/GeoLite2-City.mmdb');
// 获取用户 IP 地址(建议处理代理)
$ipAddress = $_SERVER['REMOTE_ADDR'] ?? '';
// 获取当前时间
$timestamp = date('Y-m-d H:i:s');
// 查询地理信息
try {
$record = $reader->city($ipAddress);
$stateName = $record->subdivisions[0]->name ?? '';
// 定义需要屏蔽的州列表
$blockedStates = [
'Texas', 'Utah', 'Virginia', 'Mississippi', 'Arkansas', 'Montana',
'North Carolina', 'South Carolina', 'Alabama', 'Florida', 'Indiana',
'Kentucky', 'Oklahoma', 'Idaho', 'Kansas', 'Nebraska', 'Georgia'
];
// 判断是否需要屏蔽
if (in_array($stateName, $blockedStates)) {
// 记录日志
$logEntry = "[{$timestamp}] Blocked IP: {$ipAddress} from {$stateName}\n";
file_put_contents(__DIR__ . '/blocked_access.log', $logEntry, FILE_APPEND);
// 展示提示页面
echo "<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<title>Access Restricted</title>
<style>
body { font-family: Arial, sans-serif; background-color: #f8f8f8; text-align: center; padding: 50px; }
.container { background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 0 10px rgba(0,0,0,0.1); display: inline-block; }
h1 { color: #c00; }
p { color: #333; }
</style>
</head>
<body>
<div class='container'>
<h1>Access Restricted</h1>
<p>Due to local regulations in <strong>{$stateName}</strong>, access to this content is not permitted.</p>
<p>If you believe this is an error, please contact our compliance team.</p>
</div>
</body>
</html>";
exit;
}
} catch (Exception $e) {
error_log("GeoIP lookup failed: " . $e->getMessage());
// 可选:默认允许或屏蔽
// exit;
}
// 正常页面逻辑继续执行
echo "Welcome to the site!";
?>
📁 文件说明
GeoLite2-City.mmdb:MaxMind 地理数据库文件
blocked_access.log:自动生成的日志文件,记录被屏蔽的访问尝试
提示页面:HTML 样式友好,适合合规说明或用户申诉入口
IDC头条