
最近发现流量剧增,(千万级别)20000000+的网络请求,,查看了一下日志发现原来我的网站被OpenAI 的官方网络爬虫(GPTBot),每天OpenAI 正在抓取我的网站内容,可能是用来训练或更新其 AI 模型(如 GPT-4、ChatGPT 等),为了杜绝这个非法请求,我特意写了个脚本!

这种方法通过 PHP 脚本来维护一个独立的 IP 黑名单文件,完全不影响站点主配置文件,既安全又易于管理。
首先,需要让 Nginx 加载一个外部 IP 黑名单文件。
打开站点配置文件:在宝塔面板的【网站】页面,找到你的 ThinkPHP 站点,点击右侧的【配置文件】。
添加include指令:在server { }代码块中找一个合适的位置(通常放在所有location规则之前),添加以下代码:
引入 IP 黑名单配置include /www/wwwroot/你的站点目录/ip_blacklist.conf;注意:请将 /www/wwwroot/你的站点目录/ 替换为你的站点实际路径,例如 /www/wwwroot/mysite.com/。确保该路径 Nginx 有读取权限。
3. 保存配置文件。
接下来,在你的 ThinkPHP 项目中创建一个控制器或独立 PHP 文件,用于管理ip_blacklist.conf文件。以下是一个基础示例:
<?php
/**
* 动态管理 Nginx IP 黑名单
* 路径: /app/controller/IpBlacklist.php 或类似位置
*/
class IpBlacklist
{
// 黑名单文件路径,务必与 Nginx include 路径一致
private $blacklistFile = '/www/wwwroot/你的站点目录/ip_blacklist.conf';
/**
* 添加 IP 到黑名单
* @param string $ip 要封禁的 IP
* @return bool
*/
public function addIp($ip)
{
// 1. 验证 IP 格式
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return false;
}
// 2. 构建 Nginx deny 规则
$rule = "deny {$ip};\n";
// 3. 将规则追加到黑名单文件
file_put_contents($this->blacklistFile, $rule, FILE_APPEND | LOCK_EX);
// 4. 重载 Nginx 使配置生效
return $this->reloadNginx();
}
/**
* 从黑名单移除 IP(进阶功能)
* @param string $ip 要解封的 IP
* @return bool
*/
public function removeIp($ip)
{
if (!file_exists($this->blacklistFile)) {
return true;
}
// 读取所有行,移除包含该 IP 的行
$lines = file($this->blacklistFile, FILE_IGNORE_NEW_LINES);
$newLines = array_filter($lines, function($line) use ($ip) {
return strpos($line, $ip) === false;
});
// 写回文件
file_put_contents($this->blacklistFile, implode("\n", $newLines) . "\n", LOCK_EX);
// 重载 Nginx
return $this->reloadNginx();
}
/**
* 重载 Nginx 服务
* @return bool
*/
private function reloadNginx()
{
// 执行 nginx -s reload 命令
exec('/usr/sbin/nginx -s reload 2>&1', $output, $returnCode);
return $returnCode === 0;
}
}在需要封禁 IP 的地方(如后台管理或防攻击逻辑中),调用上述方法即可:
// 示例:在控制器中封禁当前访问者 IP
$ipBlocker = new IpBlacklist();
$visitorIp = $_SERVER['REMOTE_ADDR'];
if ($ipBlocker->addIp($visitorIp)) {
echo "IP {$visitorIp} 已被成功封禁。";
} else {
echo "封禁失败,请检查。";
}文件权限:确保 Web 用户(通常是www)对站点目录有写入权限,否则 PHP 无法创建或修改ip_blacklist.conf文件。
Nginx 重载命令:代码中的重载命令/usr/sbin/nginx -s reload适用于大多数宝塔环境。如果不行,可以尝试service nginx reload或systemctl reload nginx。
安全性:为防止 IP 黑名单文件被恶意访问,建议在 Nginx 中禁止直接访问*.conf文件。可以在站点配置中添加:
location ~ \.conf$ {
deny all;
}考虑使用 CDN/防火墙:如果你的站点使用了 Cloudflare 等 CDN 服务,获取真实 IP 的配置会更复杂。同时,对于大规模或自动化的 IP 封禁需求,使用宝塔面板自带的Nginx 防火墙插件是更省力的选择。
这种方法将业务逻辑(PHP)和服务器配置(Nginx)很好地分离,既满足了动态管理的需求,也保持了系统的稳定和可维护性。