aijun's blog
type: channel
link: https://aijun.org/
description: 这是我的个人博客，初创于2004年，主要是记录、分享、工作及生活的相关内容...
items: Nginx服务器上如何配置规则，拦截AI爬虫、垃圾SEO蜘蛛采集器、拦截空UA
items: 江苏省美术与设计类高考志愿填报及录取规则详解
items: 帝国CMS列表的分页导航标签show.listpage样式优化
items: 帝国CMS文章内容页下载附件时恢复为原始名称
items: Typecho 博客主题 Facile 个性化修改日志
items: 在网站上实现一个符合规范的 Cookies 条款弹窗代码，让用户选择同意或拒绝
items: 帝国CMS解决图片集morepic的上传照片数量上限限制
items: 帝国CMS8.0文章内容CKedit代码高亮显示
items: Typecho博客在分享内容页给好友或朋友圈时，显示缩微图和简介的模板代码
items: 分享一个帝国CMS防止机器人灌入“反馈信息”的办法

Nginx服务器上如何配置规则，拦截AI爬虫、垃圾SEO蜘蛛采集器、拦截空UA
type: item
date: 2026-06-12T17:54:00+08:00
description: 网站每天消耗大量流量，排查服务器日志后才发现，这些流量大多来自毫无价值的垃圾蜘蛛、AI爬虫、各种垃圾SEO采集器。这些垃圾蜘蛛不仅不会为网站带来任何正向价值，反而会持续占用服务器带宽和资源，拖慢网站加载速度，甚至影响正常用户访问。想要从根源上解决这个问题，最直接有效的方法就是屏蔽它们。当然，不能影响正常用户、不影响百度 / 谷歌 / 必应。我整理了一些规则，专门用于屏蔽各类常见垃圾蜘蛛及无效的ai爬虫，建议收藏备用或转摘。Nginx 配置文件（以宝塔为例）位置：网站 → 你的站点 → 设置 → 伪静态# 1. 拦截 AI 爬虫 if ($http_user_agent ~* "GPTBot|ChatGPT|ClaudeBot|Anthropic|OpenAI|Perplexity|PPLX|Google-Extended|Applebot-Extended|Amazonbot") { return 403; } # 2. 拦截垃圾 SEO 蜘蛛 / 采集器 if ($http_user_agent ~* "AhrefsBot|SemrushBot|MJ12bot|DotBot|BLEXBot|Webdup|Ezooms") { return 403; } # 3. 拦截 空UA / 极短UA（扫描器、恶意访问） if ($http_user_agent ~* "^$|^.{0,5}$") { return 403; }同时配合加 robots.txt 规则# AI 爬虫 User-agent: GPTBot Disallow: / User-agent: OAI-SearchBot Disallow: / User-agent: ChatGPT-User Disallow: / User-agent: ClaudeBot Disallow: / User-agent: anthropic-ai Disallow: / User-agent: PerplexityBot Disallow: / User-agent: PPLX-* Disallow: / User-agent: CCBot Disallow: / User-agent: Google-Extended Disallow: / User-agent: Applebot-Extended Disallow: / User-agent: Amazonbot Disallow: / User-agent: YouBot Disallow: / User-agent: ByteDance Disallow: / User-agent: cohere-ai Disallow: / User-agent: Claude-Web Disallow: / # 垃圾蜘蛛 User-agent: AhrefsBot Disallow: / User-agent: SemrushBot Disallow: / User-agent: MJ12bot Disallow: / User-agent: DotBot Disallow: / User-agent: BLEXBot Disallow: / User-agent: Webdup Disallow: / User-agent: Ezooms Disallow: / User-agent: ScreamingFrog Disallow: / User-agent: SeznamBot Disallow: / User-agent: PetalBot Disallow: / User-agent: AspiegelBot Disallow: / User-agent: Go-http-client Disallow: / # 正常搜索引擎 User-agent: Baiduspider Allow: / User-agent: Googlebot Allow: / User-agent: Bingbot Allow: / User-agent: Googlebot-Image Allow: / User-agent: Bingbot-Image Allow: / User-agent: * Crawl-delay: 5 Allow: /保存为 robots.txt，文件拷贝放置到网站更目录下。访问测试：https://你的域名/robots.txt，能打开就说明生效。爬虫 UA 详细说明（所属主体、用途、封禁原因）一、AI 类爬虫（用于大模型训练 / AI 检索，纯消耗资源，无有效访客）User-Agent所属公司/项目主要用途封禁原因GPTBot、ChatGPT-User、OAI-SearchBotOpenAI（美国）爬取全网内容，用…

江苏省美术与设计类高考志愿填报及录取规则详解
type: item
date: 2026-06-08T12:36:00+08:00
description: 又是一年高考时，每年江苏美术生填报志愿时，绝大多数家长和孩子都很迷茫：看不懂综合分怎么算、分不清录取批次区别、不清楚平行志愿有哪些风险，很多人凭着旧经验、乱看网上碎片信息填报，最后出现滑档、退档、分数浪费等问题。网上艺考政策内容杂乱、真假混杂，很容易误导大家。本文依据2025年江苏省教育考试院的官方政策结合博主的亲身经历撰写，给江苏省美术类考生和零基础家长使用。全篇不讲生硬的官方套话，用直白、接地气的语言，一步步讲清报考条件、分数算法、批次规则、投档逻辑、填报技巧和避坑要点，内容系统、完整、可以照着参考使用。读完本文，家长和考生可以彻底搞懂江苏美术艺考录取逻辑，精准定位自己的分数段位，科学排好志愿梯度，避开绝大多数填报误区，稳稳用好每一分成绩，选到最合适的大学和专业。第一章 江苏省美术与设计类高考报考基础认知1.1 报考资格与硬性门槛江苏美术高考不是“有分数就能报”，有几条硬性门槛，缺一不可。家长一定要提前核对，避免辛苦考完却没有录取资格。第一，必须完成普通高考正式报名。想要参加美术统考、校考、志愿填报和录取，前提是完成江苏省普通高考报名，没有报名记录的考生，后续所有艺考流程都无法参与。第二，美术省统考必须合格。按照最新江苏艺考政策，省统考不合格的考生，没有资格参加校考，也没有任何美术类专业的录取资格。哪怕文化课考得再好，也走不了美术批次，只能按普通类报考。第三，严格区分物理类、历史类。江苏美术生分物理、历史两类单独录取，计划、分数线、投档数据全部独立，互不通用。家长查往年数据、排志愿时，一定要对照孩子的选科，不能混看、乱参考。第四，文化、专业双成绩都要看。美术录取不是只看画画，也不是只看文化课，必须两项成绩同时达标、综合计算，单方面成绩再好也不能保证录取。1.2 核心分数规则（家长最关心）江苏美术录取不单独看文化分、也不单独看专业分，全程以综合投档分排名录取。综合分高低，直接决定孩子能不能上岸、能上什么层次的学校。2025年官方统一综合分计算公式：美术与设计类投档分=[(高考文化分÷文化满分)×0.6+(专业分÷专业满分)×0.4]×750，结果四舍五入取整。简单理解权重：文化课占60%，专业课占40%。很多孩子专业分很高，但文化课偏弱，最后综合分被反超、错失好学校，就是这个原因。家长日常快速估算，可以用简化公式：投档分=文化分×60%+专业分，误差极小，方便快速定位分数水平。另外家长一定要记住双控制线规则：孩子的文化分、专业分，必须同时过当年的省最低控制线。只要有一门没过线，直接失去本科、专科所有美术类录取资格。通俗总结：双过线是进门资格，综合分是排名名次，文化课是拉分关键，三项共同决定孩子的录取档次。第二章 江苏美术与设计类录取批次与志愿设置（核心规则）2.1 整体批次架构很多家长容易搞混：江苏美术生没有普通本科批次，所有美术本科名额，全部集中在本科提前批；专科名额单独划为专科批次。整体就两大批次：本科提前批+专科批次。上一批次没被录取，完全不影响下一批次填报和录取。2.2 本科提前批细分规则（重点）本科提前批是美术生读本科的唯一机会，其中分为两个小批，录取方式、志愿数量差别很大，家长一定要分清。第1小批：校考/戏曲联考批次。采用顺序志愿，只能填1个院校专业组。仅针对拿到院校校考合格证、戏曲联考合格的考生。普通统考合格考生不能填报。这个批次风险更高，学校优先录取第一志愿考生，分数高也不一定稳录，适合有优质校考成绩的孩子冲名校。第2小批：省统考批次。绝大多数江苏美术生的主力录取批次，采用平行志愿，可以填20个院校专业组，每个组能填4个专业+专业服从调剂。招生名额最多、学校选择最广、录取最稳，只要双过线都能填报。2.3 专科批次志愿规则美术与设计类专科批次同样分两类：统考类可以填20个平行院校专业组，规则和本科第2小批一致；戏曲联考类只能填1个院校专业组。提醒家长：本科批次滑档、退档的孩子，只要双过线，专科批次正常填报、正常录取，批次之间互不影响。2.4 关键概念通俗解读1. 院校专业组院校专业组是江苏志愿填报的最小单位。简单说：一所大学会把办学地点、学费、选科要求、培养方向相近的专业，归为同一个“专业组”。调剂只在同一个组内进行，不同组之间不能互调。填报时必须符合该组的选科要求，才能报考。2. 平行志愿 vs 顺序志愿平行志愿（本科第2小批、省统考）：分数说了算。全省孩子按综合分从高到低排队，分数高的先投档，志愿顺序只做检索参考，非常公平、稳妥，滑档风险低。顺序志愿（校考小批、戏曲联考）：志愿优先说了算。学校先收第一志愿的学生，名额有空再收后面志愿的孩子。哪怕分数更高，志愿靠后也可能被低分考生挤掉，风险更大。3. 专业服从调剂调剂只针对当前填报的这个院校专业组。勾选服从调剂：投档进校后，填报的4个专业满额了，学校会把孩子调…

帝国CMS列表的分页导航标签show.listpage样式优化
type: item
date: 2026-04-24T10:43:00+08:00
description: 帝国CMS的分页导航（列表式）[!--show.listpage--]默认的样式没达到自己的需求，自己调整了一下。修改class/t_functions.php，替换行100~169（7.5版本。其他版本可能不同行）//列表模板之列表式分页 function sys_ShowListMorePage($num,$page,$dolink,$type,$totalpage,$line,$ok,$search="",$add){ global $fun_r,$public_r; if($num<=$line) { $pager['showpage']=''; return $pager; } //文件名 if(empty($add['dofile'])) { $add['dofile']='index'; } //静态页数 $repagenum=$add['repagenum']; $page_line=$public_r['listpagelistnum']; $snum=2; //$totalpage=ceil($num/$line);//取得总页数 //$firststr=' '.$num.' '; //上一页 if($page<>1) { $toppage=''.$fun_r['startpage'].''; $pagepr=$page-1; if($pagepr==1) { $prido=$add['dofile'].$type; } else { $prido=$add['dofile'].'_'.$pagepr.$type; } $prepage=''.$fun_r['pripage'].''; } //下一页 if($page!=$totalpage) { $pagenex=$page+1; $nextpagelink=$repagenum&&$repagenum<$pagenex?eReturnRewritePageLink2($add,$pagenex):$dolink.$add['dofile'].'_'.$pagenex.$type; $lastpagelink=$repagenum&&$repagenum<$totalpage?eReturnRewritePageLink2($add,$totalpage):$dolink.$add['dofile'].'_'.$totalpage.$type; $nextpage=''.$fun_r['nextpage'].''; $lastpage=''.$fun_r['lastpage'].''; } $starti=$page-$snum<1?1:$page-$snum; $no=0; for($i=$starti;$i<=$totalpage&&$no<$page_line;$i++) { $no++; if($page==$i) { $is_1=''; $is_2=""; } elseif($i==1) { $is_1=''; $is_2=""; } else { $thispagelink=$repagenum&&$repagenum<$i?eReturnRewritePageLink2($add,$i):$dolink.$add['dofile'].'_'.$i.$type; $is_1=''; $is_2=""; } $returnstr.=''.$is_1.$i.$is_2; } $returnstr=$firststr.$toppage.$prepage.$returnstr.$nextpage.$lastpage; $pager['showpage']=$returnstr; return $pager; }下面是自己常用的CSS样式：.listpage{margin-top:30px;text-align:center;clear:both;height:40px;line-height:40px;font-size:16px;} .listpage a{color:#d00;margin-right:8px;text-decoration:none;padding:6px 12px;border:1px solid #eee;border-radius:4px;} .listpage a:hover{color:#d00;background-color:#f5f5f5;text-decoration:none;border:1px solid #d00;} .listpage a:active{color:#d00;background-color:#f5f5f5;border:1px solid #666;} .listpage span.…

帝国CMS文章内容页下载附件时恢复为原始名称
type: item
date: 2026-03-23T08:39:00+08:00
description: 在你的内容模板里加入下面的代码，可显示出原始文件名，下载保存时也会保存为原始文件名： 原模板下载后的附件名都是随机的一长串数字，这样改一下，就不用手动再去改下载后的文件名了，很方便。（注：后台编辑文章时还是不变的，附件名还是一串乱七八糟的数字，发布后前台会改变）效果演示：另一个：下载模型中，将下载文件名改为与标题一致在“最终下载页模板”下方加入以下JS，可实现下载文件时存档文件名与标题一致，自动加入文件后辍，省了让那一长串随机数字带来的烦恼： 文章来源：http://www.artery2000.com/news/2025-09-23/109.html

Typecho 博客主题 Facile 个性化修改日志
type: item
date: 2026-03-04T16:04:00+08:00
description: 博客上一个主题是 Initial 用了2-3年，后来更换到 Facile，目前是2.5版本，为方便以后跟随主题作者更新，根据自己的需求做了一些修改。1、自定义CSS样式header .navbar{border-width:0 0 1px 0;} .post-list .post .post-title{font-size:26px;} .sidebar section h2{font-size:14px;} .sidebar section ul li{font-size:14px;} .sidebar section ul li a{font-size:14px;} .sidebar .latest-comment .media-body p{font-size:14px;} .text-color{font-size:14px;word-wrap:break-word;word-break:break-all;} .post-page article .post-content p{line-height:1.8;} .post-page article .post-content img:not(.logo){display:inline;} .post-page article .post-content blockquote{font-size:14px;padding:10px 10px 10px 20px;border-radius:0.5rem;} .light-color .post-page article .post-content blockquote{border-left:4px solid #ca896d;background:#f3f3f3;color:#444;} .dark-color .post-page article .post-content blockquote{border-left:4px solid #d69d85;background:#1e1e1e;color:#bbb;} .archive-title{border-radius:4px;padding:18px 20px 10px;text-align:center;} .archive-page .archives .archives-item ul li .day{text-align:right;} .light-color .archive-title{background:#f3f3f3;} .dark-color .archive-title{background:#16161a;} .nav-item{font-size:14px;} .nitxt .form-control{height:calc(2.25em + .75rem + 3px);} .nitxt .required{color:#f00;} .text-truncate{font-size:16px;} .table-responsive{font-size:16px;} code{font-size:100%;padding:0 4px;} #comments .comment-input .row div{margin-bottom:0;} #comments .comment-input .row div.nitxt{margin-bottom:16px;} #comments .comments-lists .comment-author .comment-reply a, #comments .comments-lists .comment-author .comment-reply i{font-size:12px;color:#888;} #copyright-info p{font-size:.8125rem;line-height:120%;} #copyright-info p a{font-size:.8125rem;} footer .text-center {font-size:12px;} @media screen and (max-width:575px) { .post-list .post .post-title{font-size:22px;} .post-page .post-title{font-size:24px;} } @media (prefers-color-scheme: dark) { .archive-title{background:#16161a;} .post-page article .post-content blockquote{border-left:4px soli…

在网站上实现一个符合规范的 Cookies 条款弹窗代码，让用户选择同意或拒绝
type: item
date: 2026-02-11T15:29:00+08:00
description: 想要在网站上实现一个符合欧美规范的 Cookies 条款弹窗，让用户选择同意或拒绝，以达合规要求。将以下代码直接添加到网站模板的末尾（ 标签前）即可： 我们使用Cookies来提升您的浏览体验。By continuing to use our website, you agree to our Cookie Policy. 同意 拒绝 × 使用注意事项：替换 中的链接为你网站实际的 Cookie 政策 / 隐私政策页面可根据网站风格修改 CSS 中的颜色、字体、间距等样式如果需要多语言，可将弹窗内的文字替换为英文（如 "We use cookies to enhance your browsing experience..."）换一种漂浮在左下角的样式： 漂浮左下角 Cookie 弹窗 <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z"/> Cookie 政策提示 我们使用 Cookie 来提升你的浏览体验，包括提供个性化内容、分析网站流量等。继续使用本网站，即表示你同意我们按照隐私政策使用 Cookie。你可随时通过浏览器设置管理 Cookie 偏好。 Cookie 设置 接受

帝国CMS解决图片集morepic的上传照片数量上限限制
type: item
date: 2026-02-03T16:29:00+08:00
description: 在使用帝国CMS，用“帝国CMS灵活调用的多图片集插件”这个方法，做的一个活动专题页面的时候，图片集morepic需上传的照片比较多（大于300张）默认配置，首次上传完成后，保存的时候，错误提示：字段图片简介的值为空，请将必填项填写完整。尝试将图片集morepic的字段类型设置为LONGTEXT了，依然不见效果。咨询一番后，调整 PHP 配置（php.ini），解决系统级限制：PHP 默认限制单次上传文件数与请求大小，不改会导致上传失败。1、找到 php.ini：通过phpinfo()查看Loaded Configuration File路径，或在宝塔面板的 PHP 设置中直接修改。2、修改参数（示例值，按需调整）：参数默认值修改建议说明max_file_uploads20500单次表单最多上传文件数，需≥计划上传数post_max_size8M500MPOST 请求总大小，需≥所有图片大小总和upload_max_filesize2M5M单张图片最大尺寸，按需调整max_execution_time30300脚本执行超时，避免大文件上传超时memory_limit128M256MPHP 内存限制，防止内存溢出3、重启服务：修改后重启 PHP-FPM、Apache 或 Nginx 使配置生效。完成以上步骤后，morepic可稳定支持单次上传 500+ 张图片，基本上没什么问题。

帝国CMS8.0文章内容CKedit代码高亮显示
type: item
date: 2026-02-01T15:49:00+08:00
description: 文末的压缩文件，解压后将文件夹codesnippet上传到：./eadmin/admin/ecmseditor/infoeditor/plugins/（eadmin和admin这两个文件夹的名称如果改过，那就上传到你改后的文件夹内）将：monokai-sublime.min.css、highlight.min.js、highlightjs-line-numbers.js这三个文件上传到网站目录的合适文件夹（前台需要调用这三个文件，不用放后台管理地址的目录。）把./eadmin/admin/ecmseditor/infoeditor/config.js改为下面内容：function EcmsEditorDoCKhtml(htmlstr){ if(htmlstr.indexOf('"')!=-1){return '';} if(htmlstr.indexOf("'")!=-1){return '';} if(htmlstr.indexOf("/")!=-1){return '';} if(htmlstr.indexOf("\\")!=-1){return '';} if(htmlstr.indexOf("[")!=-1){return '';} if(htmlstr.indexOf("]")!=-1){return '';} if(htmlstr.indexOf(":")!=-1){return '';} if(htmlstr.indexOf("%")!=-1){return '';} if(htmlstr.indexOf("<")!=-1){return '';} if(htmlstr.indexOf(">")!=-1){return '';} return htmlstr; } function EcmsEditorGetCs(){ var js=document.getElementsByTagName("script"); for(var i=0;i<js.length;i++) { if(js[i].src.indexOf("ckeditor.js")>=0) { var arraytemp=new Array(); arraytemp=js[i].src.split('?'); return arraytemp; } } } var arraycs=new Array(); arraycs=EcmsEditorGetCs(); arraycs[0]=arraycs[0].replace('infoeditor/ckeditor.js',''); arraycs[1]=document.getElementById('doecmseditor_eaddcs').value; arraycs[1]=EcmsEditorDoCKhtml(arraycs[1]); CKEDITOR.editorConfig = function( config ) { config.filebrowserImageUploadUrl = ''; config.filebrowserFlashUploadUrl = arraycs[0]; config.filebrowserImageBrowseUrl = arraycs[1]; config.filebrowserFlashBrowseUrl = arraycs[1]; config.enterMode = CKEDITOR.ENTER_BR; config.shiftEnterMode = CKEDITOR.ENTER_P; config.allowedContent = true; config.font_names='宋体/宋体;黑体/黑体;仿宋/仿宋_GB2312;楷体/楷体_GB2312;隶书/隶书;幼圆/幼圆;微软雅黑/微软雅黑;'+config.font_names; config.extraPlugins = 'codesnippet,etranfile,etranmedia,etranmore,autoformat,ecleanalltext,einsertbr,einsertpage,einserttime,equotetext'; config.codeSnippet_theme = 'monokai_sublime'; config.toolbar_full = [ { name: 'document', groups: [ 'mode', 'document', 'doctools' ], items: [ 'Source', '-', 'Preview', 'Print' ] }, { name: 'clipboard', groups: [ 'clipboard…

Typecho博客在分享内容页给好友或朋友圈时，显示缩微图和简介的模板代码
type: item
date: 2026-01-29T15:27:00+08:00
description: 在分享日志内容给好友或者朋友圈的时候，需要显示缩微图和简介内容。使用Open Graph协议，修改主题文件（header.php），在 标签内添加以下代码（带自定义字段支持）：<?php if ($this->is('post') || $this->is('page')): ?> <?php // 获取缩略图 $thumb = ''; // 先尝试自定义字段 if ($this->fields->thumb) { $thumb = $this->fields->thumb; } // 再尝试自动获取第一张图片 else { preg_match('/<img[^>]+src=[\'"]([^\'"]+)[\'"][^>]*>/i', $this->content, $matches); if (!empty($matches[1])) { $thumb = $matches[1]; } } // 处理图片路径，确保是完整URL if (!empty($thumb)) { // 如果已经是完整URL（http/https或//开头），不做处理 if (!preg_match('/^(https?:)?\/\//i', $thumb)) { // 不是完整URL，需要加上网站根URL if (strpos($thumb, '/') === 0) { // 以斜杠开头，是网站根目录下的绝对路径 $thumb = rtrim($this->options->siteUrl, '/') . $thumb; } else { // 相对路径，使用网站根URL作为基础 $thumb = rtrim($this->options->siteUrl, '/') . '/' . ltrim($thumb, '/'); } } } // 没有图片，使用默认 else { $thumb = rtrim($this->options->siteUrl, '/') . '/usr/themes/' . $this->options->theme . '/images/default-og.jpg'; } // 获取描述 if ($this->fields->excerpt) { $description = $this->fields->excerpt; } elseif ($this->description) { $description = $this->description; } else { $description = Typecho_Common::subStr(strip_tags($this->excerpt), 0, 150, '...'); } ?> <meta property="og:title" content="<?php $this->title() ?>" /> <meta property="og:url" content="<?php $this->permalink() ?>" /> <meta property="og:image" content="<?php echo $thumb ?>" /> <meta property="og:description" content="<?php echo htmlspecialchars($description) ?>" /> <meta property="og:site_name" content="<?php $this->options->title() ?>" /> <meta name="twitter:title" content="<?php $this->title() ?>" /> <meta name="twitter:description" content="<?php echo htmlspecialchars($description) ?>" /> <meta name="twitter:image" content="<?php echo $thumb ?>" /> <meta property="wechat:article:title" content="<?php $this->title() ?>" /> <meta property="wechat:article:description" content="<?php echo htmlspecialchars(Typecho_Common::subStr(strip_tags($description), 0, 120, '...')) ?>" /> <meta property="wechat:article:image" content="<?php echo…

分享一个帝国CMS防止机器人灌入“反馈信息”的办法
type: item
date: 2025-09-24T16:14:00+08:00
description: 打开：后台首页 -> 管理反馈信息 -> 管理反馈分类 -> 修改找到任何前面加： 打开：e/enews/index.php找到：eCheckCloseMods('fb');//关闭模块在后面加： if(!empty($_POST['website'])){ db_close(); $empire=null; printerror("非法提交","history.go(-1)",1); } 这样可以骗机器人去填写内容，只要填了就不能提交，类似的表单也可放多个，每个都是留给机器人的陷阱，让反馈信息变得很干净。