通过user-agent来源判断阻止爬虫访问网站,并防止生成[ error ] NULL日志

一、TP5.0通过行为(Behavior)拦截爬虫并避免生成 [ error ] NULL 错误日志

1. 创建行为类(拦截爬虫)

在 application/common/behavior 目录下新建BlockBot.php ,用于识别并拦截爬虫请求:

<?php
namespace app\common\behavior;use think\Response;class BlockBot
{// 爬虫User-Agent特征列表protected $botPatterns = ['/bot/i', '/spider/i', '/curl/i', '/wget/i', '/python/i', '/scrapy/i', '/crawl/i', '/httpclient/i',// 下面是自己添加的爬虫'/toutiao/i','/zhanzhang.toutiao.com/i','/dataforseo/i','/dataforseo.com/i','/dataforseo-bot/i','/semrush/i','/www.semrush.com/i','/YisouSpider/i',];// 白名单(搜索引擎合法爬虫)protected $allowPatterns = ['/googlebot/i', '/bingbot/i', '/baiduspider/i', '/Sogou web spider/i'];public function run(){$request = request();$userAgent = $request->header('user-agent', '');$path = $request->path();// 白名单放行foreach ($this->allowPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {trace("放行{$pattern}爬虫: UA={$userAgent}, Path={$path}", 'info');return;}}// 黑名单拦截foreach ($this->botPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {// 静默记录日志(不触发错误)trace("Blocked Bot: UA={$userAgent}, Path={$path}", 'info');// 静默拦截(不记录错误日志)$this->silentBlock();}}}/*** 静默拦截逻辑*/private function silentBlock(){// 返回404页面(或自定义响应)$response = Response::create()->code(404)->data('Access Denied')->header(['Content-Type' => 'text/plain']);// 终止后续执行throw new \think\exception\HttpResponseException($response);}}
2. 注册行为到请求事件

在 application/tags.php 中绑定行为到 app_init事件(应用初始化):

return [// 应用初始化'app_init'     => ['app\\common\\behavior\\BlockBot',  //爬虫拦截],
];
3. 自定义异常处理(防止错误日志)
(1) 创建异常处理类

在 application/common/exception 下新建 ExceptionHandler.php,覆盖默认错误处理:

<?php
namespace app\common\exception;use think\exception\Handle;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\Response;class ExceptionHandler extends Handle
{public function render(\Exception $e){// 拦截路由不存在错误(常见于爬虫探测)if ($e instanceof RouteNotFoundException) {return $this->silentResponse(404);}// 拦截参数验证错误(如分页参数过大)if ($e instanceof ValidateException) {return $this->silentResponse(400);}// 其他错误静默记录(可选)trace("Silent Error: " . $e->getMessage(), 'error');return parent::render($e);}/*** 静默响应(不记录日志)*/private function silentResponse($code){return Response::create()->code($code)->data('')->header(['Content-Type' => 'text/plain']);}
}
(2) 配置异常处理

在 application/config.php 中指定自定义异常处理器:

// 异常处理配置
'exception_handle' => 'app\common\exception\ExceptionHandler',
4. Nginx层优化(可选)

在服务器配置中拦截部分爬虫并静默处理:

server {listen 80;server_name yourdomain.com;# 拦截爬虫User-Agent并静默处理if ($http_user_agent ~* (bot|spider|python|curl|wget)) {access_log off;  # 不记录访问日志return 444;     # 静默关闭连接}# 不记录404错误日志error_page 404 = /404;location = /404 {internal;access_log off;}# ThinkPHP伪静态规则location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;break;}}
}

二、TP5.1或TP6.0通过中间件(middleware)拦截爬虫并避免生成 [ error ] NULL 错误日志

以TP5.1演示:

1. 创建拦截中间件(核心逻辑)

在 application/common/middleware 下新建 BlockBot.php,实现 双重防护:

<?php
namespace app\common\middleware;use think\Response;class BlockBot
{// 爬虫User-Agent特征列表protected $botPatterns = ['/bot/i', '/spider/i', '/curl/i', '/wget/i', '/python/i', '/scrapy/i', '/crawl/i', '/httpclient/i'];// 白名单(搜索引擎合法爬虫)protected $allowPatterns = ['/googlebot/i', '/bingbot/i', '/baiduspider/i'];public function handle($request, \Closure $next){$userAgent = $request->header('user-agent', '');$path = $request->pathinfo();// 放行白名单爬虫foreach ($this->allowPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {return $next($request);}}// 拦截黑名单爬虫foreach ($this->botPatterns as $pattern) {if (preg_match($pattern, $userAgent)) {// 静默记录日志(不触发错误)trace("Blocked Bot: UA={$userAgent}, Path={$path}", 'info');// 直接返回404或403,避免后续逻辑执行return response('', 404)->header(['Content-Type' => 'text/html; charset=utf-8']);}}return $next($request);}
}
2. 注册中间件(全局生效)

修改 application/config.php 配置,确保中间件在最优先执行:

// 中间件配置
'middleware' => ['app\common\middleware\BlockBot', // 添加此行到最前面// ...其他中间件
],
3. 防止生成 [ error ] NULL 日志
(1) 自定义错误处理(覆盖ThinkPHP5默认行为)

在 application/config.php 中配置:

// 错误处理配置
'exception_handle'       => 'app\common\exception\ExceptionHandler',

创建 application/common/exception/ExceptionHandler.php:

<?php
namespace app\common\exception;use think\exception\Handle;
use think\exception\RouteNotFoundException;
use think\exception\ValidateException;
use think\Response;class ExceptionHandler extends Handle
{public function render(\Exception $e){// 拦截路由不存在错误(常见于爬虫探测)if ($e instanceof RouteNotFoundException) {return $this->silentResponse(404);}// 拦截参数验证错误(如分页过大)if ($e instanceof ValidateException) {return $this->silentResponse(400);}// 其他错误按需处理(此处静默记录)trace("Silent Error: " . $e->getMessage(), 'error');return parent::render($e);}/*** 静默响应(不记录日志)*/private function silentResponse($code){return Response::create()->code($code)->data('')->header(['Content-Type' => 'text/plain']);}
}
(2) 配置日志过滤

修改 application/config.php 忽略部分错误类型:

// 日志配置
'log' => ['type' => 'File','level' => ['error', 'sql'],'apart_level' => ['error', 'sql'],'ignore_error' => [// 忽略路由不存在错误(避免生成 [ error ] NULL 日志)'think\exception\RouteNotFoundException',],
],
4. Nginx层优化(双重防护)
server {listen 80;server_name yourdomain.com;# 拦截爬虫User-Agent并静默处理if ($http_user_agent ~* (bot|spider|python|curl|wget)) {access_log off;  # 不记录访问日志return 444;      # 静默关闭连接}# FastAdmin伪静态规则location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=$1 last;break;}}# 不记录404错误日志error_page 404 = /404.html;location = /404.html {internal;access_log off;}
}
注意:经查,网站一直写入[ error ] NULL日志,是因为框架文件thinkphp\library\think\App.php文件代码被恶意篡改

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3ad9271f561e4ce9ac4d5c9f2867de63.png
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony平台驱动开发(十五),SDIO

OpenHarmony平台驱动开发&#xff08;十五&#xff09; SDIO 概述 功能简介 SDIO&#xff08;Secure Digital Input and Output&#xff09;由SD卡发展而来&#xff0c;与SD卡统称为MMC&#xff08;MultiMediaCard&#xff09;&#xff0c;二者使用相同的通信协议。SDIO接口…

使用FastAPI和React以及MongoDB构建全栈Web应用03 全栈开发快速入门

一、什么是全栈开发 A full-stack web application is a complete software application that encompasses both the frontend and backend components. It’s designed to interact with users through a web browser and perform actions that involve data processing and …

Coco AI 开源应用程序 - 搜索、连接、协作、您的个人 AI 搜索和助手,都在一个空间中。

一、软件介绍 文末提供程序和源码下载 Coco AI 是一个统一的搜索平台&#xff0c;可将您的所有企业应用程序和数据&#xff08;Google Workspace、Dropbox、Confluent Wiki、GitHub 等&#xff09;连接到一个功能强大的搜索界面中。此存储库包含为桌面和移动设备构建的 Coco 应…

CSS经典布局之圣杯布局和双飞翼布局

目标&#xff1a; 中间自适应&#xff0c;两边定宽&#xff0c;并且三栏布局在一行展示。 圣杯布局 实现方法&#xff1a; 通过float搭建布局margin使三列布局到一行上relative相对定位调整位置&#xff1b; 给外部容器添加padding&#xff0c;通过相对定位调整左右两列的…

# 实时英文 OCR 文字识别:从摄像头到 PyQt5 界面的实现

实时英文 OCR 文字识别&#xff1a;从摄像头到 PyQt5 界面的实现 引言 在数字化时代&#xff0c;文字识别技术&#xff08;OCR&#xff09;在众多领域中发挥着重要作用。无论是文档扫描、车牌识别还是实时视频流中的文字提取&#xff0c;OCR 技术都能提供高效且准确的解决方案…

<C#>log4net 的配置文件配置项详细介绍

log4net 是一个功能强大的日志记录工具&#xff0c;通过配置文件可以灵活地控制日志的输出方式、格式、级别等。以下是对 log4net 配置文件常见配置项的详细介绍&#xff1a; 根元素 <log4net> 这是 log4net 配置文件的根元素&#xff0c;所有配置项都要包含在该元素内…

编译docker版openresty

使用alpine为基础镜像 # 使用Alpine作为基础镜像 FROM alpine:3.18# 替换为阿里云镜像源&#xff0c;并安装必要的依赖 RUN sed -i s|https://dl-cdn.alpinelinux.org/alpine|https://mirrors.aliyun.com/alpine|g /etc/apk/repositories && \apk add --no-cache \bui…

conda 输出指定python环境的库 输出为 yaml文件

conda 输出指定python环境的库 输出为 yaml文件。 有时为了项目部署&#xff0c;需要匹配之前的python环境&#xff0c;需要输出对应的python依赖库。 假设你的目标环境名为 myenv&#xff0c;运行以下命令&#xff1a; conda env export -n myenv > myenv_environment.ym…

[Java][Leetcode middle] 121. 买卖股票的最佳时机

暴力循环 总是以最低的价格买入&#xff0c;以最高的价格卖出: 例如第一天买入&#xff0c;去找剩下n-1天的最高价格&#xff0c;计算利润 依次计算到n-1天买入&#xff1b; 比较上述利润 // 运行时间超时。 o(n^2)public int maxProfit1(int[] prices) {int profit 0;for (i…

克隆虚拟机组成集群

一、克隆虚拟机 1. 准备基础虚拟机 确保基础虚拟机已安装好操作系统&#xff08;如 Ubuntu&#xff09;、Java 和 Hadoop。关闭防火墙并禁用 SELinux&#xff08;如适用&#xff09;&#xff1a; bash sudo ufw disable # Ubuntu sudo systemctl disable firewalld # CentO…

记录一次使用thinkphp使用PhpSpreadsheet扩展导出数据,解决身份证号码等信息科学计数法问题处理

PhpSpreadsheet官网 PhpSpreadsheet安装 composer require phpoffice/phpspreadsheet使用composer安装时一定要下载php对应的版本&#xff0c;下载之前使用php -v检查当前php版本 简单使用 <?php require vendor/autoload.php;use PhpOffice\PhpSpreadsheet\Spreadshee…

前端工程化:从 Webpack 到 Vite

引言 前端工程化是现代Web开发不可或缺的一部分&#xff0c;它通过自动化流程和标准化实践&#xff0c;提高了开发效率和代码质量。在这个领域中&#xff0c;构建工具扮演着核心角色&#xff0c;而Webpack和Vite则是其中的两位重要角色。本文将探讨前端工程化的演进历程&#…

Leetcode 3543. Maximum Weighted K-Edge Path

Leetcode 3543. Maximum Weighted K-Edge Path 1. 解题思路2. 代码实现 题目链接&#xff1a;3543. Maximum Weighted K-Edge Path 1. 解题思路 这一题思路上就是一个遍历的思路&#xff0c;我们只需要考察每一个节点作为起点时&#xff0c;所有长为 k k k的线段的长度&…

香橙派zero3 安卓TV12,更换桌面launcher,开机自启动kodi

打开开发者模式&#xff0c;连击版本号&#xff0c;基本上都是这样。 adb连接 查找桌面包名 adb shell dumpsys activity activities | findstr mResumedActivity 禁用原桌面com.android.tv.launcher&#xff0c;已经安装了projectivylauncher434.apk桌面。 adb shell pm …

半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;越来越多的开发者开始探索如何将AI集成到自己的应用中。人工智能正在迅速改变各行各业的工作方式&#xff0c;从自动化客服到智能推荐系统&#xff0c;AI的应用几乎无处不在。Spring AI作为一种开源框架…

【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展

免职声明&#xff1a; 1、目前本博客分享的大部分知识产出方式是&#xff1a;学习别人知识自己实际做一遍自己的理解扩展内容自己整理、归纳、总结再分享。2、正如博客简介所说&#xff1a;这里没有教程&#xff0c;这里只做学习分享。所有的内容都是学习笔记&#xff0c;可以说…

数学复习笔记 7

前言 现在复习线代基础&#xff0c;慢慢打基础。。 转置 方阵转置之后行列式保持不变。我的笔记感觉主要不是整理知识点&#xff0c;主要是把我的一些理解记录下来。这才是我自己的东西&#xff0c;那些需要记住的知识和内容记住就好了。记住转置有四个性质&#xff0c;在讲…

AIGC时代的内容安全:AI检测技术如何应对新型风险挑战?

在数字时代&#xff0c;互联网内容以文本、图像、音频和视频等形式呈现爆发式增长&#xff0c;深刻塑造了信息传播的格局。然而&#xff0c;内容的快速传播也带来了严峻挑战&#xff1a;违法信息&#xff08;如涉黄、涉政&#xff09;、虚假广告、网络暴力等内容不仅威胁用户体…

PyTorch中的nn.Embedding应用详解

PyTorch 文章目录 PyTorch前言一、nn.Embedding的基本原理二、nn.Embedding的实际应用简单的例子自然语言处理任务 前言 在深度学习中&#xff0c;词嵌入&#xff08;Word Embedding&#xff09;是一种常见的技术&#xff0c;用于将离散的词汇或符号映射到连续的向量空间。这种…

AI 检测原创论文:技术迷思与教育本质的悖论思考

当高校将 AI 写作检测工具作为学术诚信的 "电子判官"&#xff0c;一场由技术理性引发的教育异化正在悄然上演。GPT-4 检测工具将人类创作的论文误判为 AI 生成的概率高达 23%&#xff08;斯坦福大学 2024 年研究数据&#xff09;&#xff0c;这种 "以 AI 制 AI&…