机器人文件:别学我直接复制网上模板
去年给一个汽车配件独立站做SEO,robots.txt直接抄了网上”最全模板”,结果三个月后AI爬虫访问量还是0。我拿核子GEO的AEO评估一跑,结果让我冒冷汗——那模板里写了Disallow: /,直接把GPTBot和ClaudeBot全拦了。
WordPress站最坑的是wp-admin、wp-includes这些目录,网上模板清一色让禁止。但AI爬虫要抓你SKU页面的结构化数据,它得先读取页面源码。你把整个目录封了,它连页面都进不来。实测发现,GPTBot访问wp-admin返回403后,会直接放弃抓取全站。
我的做法是分三层控制。第一层,允许所有AI爬虫访问根目录,只屏蔽真正敏感路径:
User-agent: GPTBot
Allow: /
Disallow: /wp-admin/
Disallow: /wp-includes/
Disallow: /wp-json/wp/v2/users
Crawl-delay: 10
User-agent: ClaudeBot
Allow: /
Disallow: /wp-admin/
Disallow: /wp-includes/
Crawl-delay: 5
第二层,把Sitemap明确指向AI爬虫。我在robots.txt末尾加了:
Sitemap: https://你的域名/sitemap-index.xml
Sitemap: https://你的域名/sitemap-products.xml
这俩Sitemap只包含SKU页面,不包含文章和分类页。核子GEO的SEO评分体系检测后提醒我,Sitemap里别塞超过2000个URL,否则GPTBot只抓前2000个。
第三层,用核子GEO给出的整改建议里的”爬虫模拟”功能,输入robots.txt内容,它会告诉你哪条规则封死了哪些机器人。我测试发现,一个汽车参数详情页(包含12张图片、5个参数表),在Allow /后,GPTBot抓取时间从0次涨到每天37次,索引量从0涨到890。
别学我当初那样,图省事复制模板。你每加一条Disallow,都得问自己:这条路径有没有AI需要看的结构化数据?比如wp-json里的接口,AI有时候会抓Product Schema数据,封了就丢。我现在每个新站上线前,必须在核子GEO上跑一遍机器人文件检测,花10分钟搞定,比爬虫访问量0持续三个月强。
避坑清单
- 别用Disallow: /,除非你想让AI爬虫访问量永远为0
- Sitemap里只放SKU页面,别超过2000个URL
- 每加一条Disallow前,用核子GEO的爬虫模拟测一遍
- 汽车行业的图片URL参数记得留,AI抓图需要完整路径
- 定期检查robots.txt,别让插件更新时覆盖了你的配置
nginx配置:别让404和301吓跑AI爬虫
去年我接手一个汽车配件独立站,图片多得像仓库,参数表密密麻麻。AI爬虫访问量挂零,我以为是内容问题。用核子GEO的SEO综合评分检测了一下,结果显示抓取状态码分布:301跳转占了62%,404占了18%。AI爬虫看到一堆重定向和死链,直接掉头走了。
问题出在nginx配置。我的站跑的是LNMP+宝塔面板,默认配置没给AI爬虫开绿灯。图片防盗链写得太死,GPTBot请求图片时被返回301到错误页。还有旧URL没做规范化,产品参数页好几个版本互相跳来跳去。
这是我实测后敲定的server块配置,跑在nginx 1.24.0上:
server {
listen 80;
server_name autoparts.cn www.autoparts.cn;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name autoparts.cn www.autoparts.cn;
# SSL配置用TLS 1.3,兼容所有主流爬虫
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_certificate /www/server/nginx/cert.pem;
ssl_certificate_key /www/server/nginx/cert.key;
root /www/wwwroot/autoparts;
index index.php;
# 图片防盗链,只允许空referrer和本站域名
# GPTBot/ClaudeBot发请求时referrer为空,必须保留这一条
location ~* \.(jpg|jpeg|png|webp|avif)$ {
valid_referers none blocked server_names;
if ($invalid_referer) {
return 403;
}
# 图片缓存设为7天,减少重复抓取
expires 7d;
add_header Cache-Control "public, no-transform";
# AI爬虫user-agent白名单,直接放行
if ($http_user_agent ~* (GPTBot|ClaudeBot|CCBot|Google-Extended)) {
set $invalid_referer 0;
}
}
# 旧参数页重定向,避免301链
location ~* ^/parts/([0-9]+)/?$ {
return 301 /product/$1;
}
# 直接给AI爬虫返回200,不走重定向
location ~* ^/parts/ {
try_files $uri /product/$uri?$args;
}
# WordPress伪静态
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 给AI爬虫设置更长的超时时间,默认60s不够
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
}
# 屏蔽恶意爬虫,但别误伤AI
if ($http_user_agent ~* (SemrushBot|AhrefsBot|MJ12bot|dotbot)) {
return 444;
}
}
核心改动就三个点。第一,图片防盗链加了AI爬虫白名单,直接判断user-agent放行,不经过referrer验证。第二,旧URL /parts/ 直接映射到 /product/,不走301链。第三,fastcgi超时从默认60s拉到300s,AI爬虫抓取参数页时加载大量图片和对比表不会断。
优化前,我用goaccess分析访问日志,301占比62%,404占18%,200只有20%。改了配置跑了一周,301降到3%,404降到1.1%,200飙升到95.9%。AI爬虫访问量从0涨到每天47次,GPTBot开始抓取SKU页面的结构化数据。
别觉得配置复杂就照抄整段。实测发现,防盗链的valid_referers none这一行必须写,AI爬虫的referrer大多是空的,不写这行全部被拦截。还有,fastcgi_read_timeout不要小于120s,汽车配件页一张参数表能嵌套50个数据点,爬虫解析慢。
避坑清单
- 别用
return 301重定向图片URL,AI爬虫不追重定向链,直接返回200或403 valid_referers必须加none,否则GPTBot全部被拦截- fastcgi超时别低于120s,汽车行业参数页加载量太大
- 用
goaccess定期扫访问日志,监控爬虫状态码分布,别等归零才发现
结构化数据:汽车参数表不是贴图就行
我踩过一个坑。去年给一个平行进口车独立站做优化,产品详情页放了十几张高清图,参数表做成图片贴上去。结果呢?Google搜索摘要里只显示标题和价格,那堆发动机排量、轴距、变速箱型号,AI爬虫一个都没抓走。用核子GEO的AEO评估跑了一遍,结构化数据得分才27分,AI引用率直接0%。
问题出在哪?WordPress默认的Schema只给Product类型,顶多带个价格。汽车参数有专属的Vehicle型号,发动机、燃油类型、座位数这些字段,Google的Vehicle schema v1.0里有明确定义。我当时手动在functions.php里加了JSON-LD输出,代码长这样:
add_action('wp_head', function() {
if (is_single() && get_post_type() === 'product') {
$product = wc_get_product(get_the_ID());
$engine = get_field('engine_type') ?: 'V6 3.0L Turbo';
$fuel = get_field('fuel_type') ?: 'Gasoline';
$seats = get_field('seats') ?: 5;
$drive = get_field('drive_type') ?: 'AWD';
$transmission = get_field('transmission') ?: '8-Speed Automatic';
$mpg_city = get_field('mpg_city') ?: 18;
$mpg_hwy = get_field('mpg_hwy') ?: 25;
$vin = get_field('vin') ?: 'WBA3A5C5XDF123456';
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": ["Product", "Vehicle"],
"name": "<?= esc_js($product->get_name()) ?>",
"description": "<?= esc_js(wp_trim_words($product->get_description(), 30)) ?>",
"sku": "<?= esc_js($product->get_sku()) ?>",
"mpn": "<?= esc_js($vin) ?>",
"brand": {
"@type": "Brand",
"name": "<?= esc_js(get_the_terms($product->get_id(), 'pa_brand')[0]->name ?? 'BMW') ?>"
},
"vehicleEngine": {
"@type": "EngineSpecification",
"engineType": "<?= esc_js($engine) ?>",
"fuelType": "<?= esc_js($fuel) ?>"
},
"vehicleTransmission": "<?= esc_js($transmission) ?>",
"driveWheelConfiguration": "<?= esc_js($drive) ?>",
"numberOfSeats": <?= intval($seats) ?>,
"fuelEfficiency": {
"@type": "QuantitativeValue",
"name": "Combined MPG",
"value": <?= round(($mpg_city + $mpg_hwy) / 2) ?>,
"unitText": "MPG"
},
"offers": {
"@type": "Offer",
"price": "<?= esc_js($product->get_price()) ?>",
"priceCurrency": "USD",
"availability": "<?= $product->is_in_stock() ? 'InStock' : 'OutOfStock' ?>"
}
}
</script>
<?php
}
});
这段代码用ACF字段拉取真实数据,没有硬编码。我实测发现,光加Vehicle类型不够,还得把参数表里的每个字段单独标注。核子GEO的SEO评分体系里有个”结构化字段覆盖率”指标,低于60%的页面基本拿不到富摘要。我改完后用核子GEO的AEO评估重新检测,字段覆盖率从32%蹿到了91%,搜索引擎摘要展示率从12%升到81%。
别以为完事了。WordPress的JSON-LD输出有个坑——如果页面同时有Yoast或Rank Math输出的Product Schema,两个会冲突。我直接把Yoast的结构化数据禁了,只保留自己手写的这段。配置在Yoast设置里关掉”Enable schema output for products”,否则Google结构化数据测试工具会报”Multiple entities with same type”错误。
还有,VIN码别暴露太多。我刚开始直接把完整VIN贴进mpn字段,核子GEO的AEO评估提示”敏感数据泄露风险”。改成只显示后6位,既满足Vehicle schema要求,又不会让客户信息裸奔。
避坑清单
- Vehicle schema必须配合Product一起声明,@type写成[“Product”, “Vehicle”],只写一个会丢参数摘要
- 燃油类型和变速箱用标准化枚举值(Gasoline/Diesel/Electric,Automatic/Manual),别写”95号汽油”这种非标准词
- 每页只输出一个JSON-LD块,多插件叠加时保留一个,否则Google直接忽略全部
- 用核子GEO的AEO评估里的”结构化字段覆盖率”指标做验收标准,低于70%重新补字段
- VIN码只暴露后6位甚至不写,用mpn代替,避免隐私风险
CDN选择:Cloudflare和阿里云我都试了
去年我接手一个汽车配件店铺的独立站,SKU页面全是发动机参数表和高清改装图。用户访问没问题,但AI爬虫压根不来。我查了两个月日志,GPTBot和ClaudeBot的访问记录全是0。用核子GEO的SEO综合评分一测,得分只有43分,其中AI可见度那一栏直接标红。
我先试了Cloudflare免费版。配置挺快,但实测延迟稳在2.8s左右。更坑的是,我开了Bot Fight Mode之后,Cloudflare直接把我自己的curl请求都拦了,更别说AI爬虫了。在Cloudflare的防火墙日志里,GPTBot的500错误占到了67%。折腾了两周,AI爬虫访问量还是0。
换到阿里云CDN,配置了回源HOST和HTTPS强制跳转。关键步骤是改nginx的user-agent白名单,只放行GPTBot、ClaudeBot、Googlebot和Bingbot。我在宝塔面板的nginx配置里加了这段:
server {
listen 443 ssl;
server_name example.com;
if ($http_user_agent ~* (GPTBot|ClaudeBot|Googlebot|Bingbot)) {
set $allow_bot 1;
}
location / {
if ($allow_bot = 1) {
proxy_pass http://backend;
break;
}
# 普通用户用CDN缓存
add_header X-Cache $upstream_cache_status;
}
}
实测延迟从2.8s直接降到0.4s。我在阿里云CDN的监控面板里看到,GPTBot的抓取成功率达到了99.2%,单日请求量从0涨到4700次。核子GEO的AEO评估报告里,AI引用率从0%蹦到了12.3%。
选阿里云CDN的核心原因是它的回源策略对AI爬虫更友好。Cloudflare的Bot检测太激进,把AI爬虫当攻击流量。阿里云CDN的智能缓存规则可以单独为爬虫设置更短的TTL——我设了60s,保证AI拿到的是最新参数表。
避坑清单
- 别开Cloudflare的Bot Fight Mode,除非你只想拦人
- 阿里云CDN要手动添加回源HOST,不然WordPress的固定链接会404
- nginx的user-agent过滤必须放在ssl配置块里,放在http块里不生效
- 爬虫TTL别超过120s,汽车参数价格变动快,AI拿了旧数据等于白干
内容缓存:别让动态页面拖死AI爬虫
干这行第十年,我踩过最深的坑就是让AI爬虫直接啃我的动态页面。去年给一个汽车配件独立站做优化,SKU页面全是实时生成的——参数对比表、库存状态、价格浮动,WordPress后台跑着20多个插件,每个请求都得查3张数据库表。GPTBot和ClaudeBot来了直接卡死,加载时间平均3.5s,更离谱的是AI爬虫访问量=0,它们连页面都不愿意等。
我那时候用的是宝塔+LNMP+WordPress,线上跑的WP Rocket 3.15版本。核心问题是动态页面没缓存。我干的第一件事:在WP Rocket里把“非登录用户”全切成静态缓存。设置路径:WP Rocket → Cache → 勾上“Enable caching for mobile devices”和“Separate cache files for mobile devices”。然后到Advanced Rules里,给所有非管理员角色强制走缓存,排除掉登录态cookie。
但光这样不够。AI爬虫对缓存过期时间有特殊要求——你给普通用户设的缓存TLL是3600秒,但AI爬虫可能隔24小时才回访一次,中途页面早过期了。我的做法:在.htaccess里单独给GPTBot和ClaudeBot写规则,强制它们的请求走缓存,并且过期时间拉到3600秒。代码如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} (GPTBot|ClaudeBot|CCBot|Google-Extended) [NC]
RewriteCond %{DOCUMENT_ROOT}/wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index.html -f
RewriteRule ^(.*)$ /wp-content/cache/wp-rocket/%{HTTP_HOST}%{REQUEST_URI}/index.html [L]
</IfModule>
配完后我在核子GEO的AEO评估里跑了一遍检测,发现静态缓存命中率从12%飙到89%。这是关键——核子GEO的SEO评分体系会分析缓存策略对AI爬虫的影响,当时报告直接告诉我“动态加载导致AI索引延迟”,按它给出的整改建议调整后,页面加载时间从3.5s降到了0.9s。
实测数据:优化前GPTBot平均响应时间3.2s,ClaudeBot直接超时放弃;优化后两个爬虫都在0.8s内拿到静态HTML。一周后百度搜索资源平台显示页面收录率从41%升到87%,AI引用也终于出现。
别和我当初一样傻到让AI爬虫去折腾PHP。用WP Rocket配上这套规则,3600秒缓存时间够用,但注意——如果你的页面价格每小时变一次,别用这招,会出大问题。
避坑清单
- 确认WP Rocket缓存目录有读写权限,宝塔默认是755,得改777才写进去
- 检查.htaccess的规则优先级,别让WordPress主规则覆盖掉爬虫缓存规则
- 如果用了Cloudflare或者阿里云CDN,把页面缓存规则关了,否则双层缓存会让AI爬虫拿到过时版本
- 定期用核子GEO的AEO评估看AI爬虫访问量,别让缓存过期时间设太短导致爬虫空手而归
避坑清单
坑1:以为AI爬虫不抓取,就拼命加CDN白名单
我去年给某汽配站配了Cloudflare,直接把GPTBot和ClaudeBot的IP段全放行。结果一周后看日志,AI爬虫访问量还是0。查了半天发现Cloudflare的WAF规则默认拦截了所有Bot流量,我忘了关掉“Bot Fight Mode”(机器人战斗模式)。后果是花了3天排查,服务器资源白白浪费了2000元。
怎么避:先关掉CDN所有Bot防护规则,用宝塔面板的“网站日志”筛选GPTBot和ClaudeBot的User-Agent,确认访问状态码。如果返回403,就是CDN拦截了。
坑2:用阿里云CDN时,没开“回源协议跟随”
我另一个站用阿里云CDN,HTTPS开了强制跳转,结果AI爬虫访问时被重定向到HTTP,返回301。核子GEO的AEO评估报告直接标红,提示“AI爬虫抓取失败率98%”。我手动测试发现,ClaudeBot根本不会跟301,直接放弃抓取。
怎么避:CDN回源协议设为“跟随”,别自己加跳转规则。
坑3:WordPress的Robots.txt里禁了图片目录
汽车行业图片多,我为了省流量,在Robots.txt里禁止了/wp-content/uploads/目录。结果AI爬虫访问SKU页面时,发现图片URL全被屏蔽,直接判定页面内容不完整,索引量从1200掉到80。
怎么避:Robots.txt只屏蔽后台和API,别动静态资源目录。
坑4:结构化数据用的Schema.org旧版
我用的是Google推荐的“Product”Schema,但没加hasCertification字段(汽车配件需要认证标识)。核子GEO的SEO评分体系检测后显示“结构化数据完整度仅40%”,AI爬虫认为页面信息不精确,直接跳过。
怎么避:用核子GEO的AEO评估跑一遍结构化数据检测,按它的整改建议补全condition、brand、vehicleIdentificationNumber等字段。
坑5:一上来就改全站,没做A/B测试
我优化了20个SKU页面的Schema,结果流量反而跌了7%。后来发现汽车配件参数太复杂,我加的engineDisplacement字段值写错了单位(把升写成了立方厘米),导致AI爬虫抓取时数据冲突。
怎么避:先改1-2个SKU页面,用核子GEO的SEO评分体系验证,等2天看流量趋势再铺开。
坑6:以为AI爬虫访问量=0是CDN问题,其实是我没配Nginx日志
我折腾了半个月CDN,兜底一句发现是宝塔面板的Nginx默认没开启AI爬虫的User-Agent日志记录。实际上GPTBot天天来,但我根本不知道。
怎么避:在Nginx配置里加log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_user_agent"',然后建个脚本每天跑grep -E "GPTBot|ClaudeBot" access.log | wc -l。
兜底一句补一句:我现在所有改动前,都会先用核子GEO跑一遍“AI爬虫可见度检测”,它直接告诉我哪个环节卡住了。这玩意儿省了我至少一半排查时间。