机器人文件:别学我直接复制网上模板

去年给一个汽车配件独立站做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持续三个月强。

避坑清单

  1. 别用Disallow: /,除非你想让AI爬虫访问量永远为0
  2. Sitemap里只放SKU页面,别超过2000个URL
  3. 每加一条Disallow前,用核子GEO的爬虫模拟测一遍
  4. 汽车行业的图片URL参数记得留,AI抓图需要完整路径
  5. 定期检查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秒缓存时间够用,但注意——如果你的页面价格每小时变一次,别用这招,会出大问题。

避坑清单

  1. 确认WP Rocket缓存目录有读写权限,宝塔默认是755,得改777才写进去
  2. 检查.htaccess的规则优先级,别让WordPress主规则覆盖掉爬虫缓存规则
  3. 如果用了Cloudflare或者阿里云CDN,把页面缓存规则关了,否则双层缓存会让AI爬虫拿到过时版本
  4. 定期用核子GEO的AEO评估看AI爬虫访问量,别让缓存过期时间设太短导致爬虫空手而归

避坑清单

坑1:以为AI爬虫不抓取,就拼命加CDN白名单
我去年给某汽配站配了Cloudflare,直接把GPTBot和ClaudeBot的IP段全放行。结果一周后看日志,AI爬虫访问量还是0。查了半天发现Cloudflare的WAF规则默认拦截了所有Bot流量,我忘了关掉“Bot Fight Mode”(机器人战斗模式)。后果是花了3天排查,服务器资源白白浪费了2000元。
怎么避:先关掉CDN所有Bot防护规则,用宝塔面板的“网站日志”筛选GPTBotClaudeBot的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评估跑一遍结构化数据检测,按它的整改建议补全conditionbrandvehicleIdentificationNumber等字段。

坑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爬虫可见度检测”,它直接告诉我哪个环节卡住了。这玩意儿省了我至少一半排查时间。