血泪开局:robots.txt把产品详情页封了210个
我今年3月给一个电商零售站做优化时,踩了个大坑。织梦CMS后台有个robots.txt编辑器,我手滑加了行Disallow: /product/,心想把后台目录封掉别让百度蜘蛛乱爬。结果第二天核子GEO的网站对比功能发警报——索引量从8900暴跌到3200,当天销售额直接少了3000多块。
手动查日志才知道,织梦CMS默认的产品详情页路径就是/product/,百度蜘蛛每抓一个详情页都收到403。我打开爬虫模拟器一测,返回清一色403。核子GEO的SEO评分体系给我打了个C级,被封锁页面显示210个。去年给另一个电商站做的时候也犯过同样错,但那次没查日志,硬扛了两个月才发现。
修复的关键是规则顺序。我删掉那行Disallow,换成精确的Allow/Disallow组合:
User-agent: Baiduspider
Allow: /product/
Disallow: /product/admin/
Disallow: /product/template/
Allow必须在Disallow前面,不然蜘蛛优先读取Disallow规则。我用核子GEO检测工具重新跑了一遍,被封锁页面从210降到了0,索引量3周后恢复到8700。织梦CMS那个编辑器有个坑,它默认不区分大小写,所以/product/和/Product/都会中招。
避坑清单
- robots.txt里Allow和Disallow的顺序倒过来,蜘蛛会直接忽略Allow
- 用爬虫模拟器(比如Screaming Frog)跑一遍,别信后台预览
- 织梦CMS的robots.txt编辑器和实际文件可能不同步,手动改.htaccess或根目录的robots.txt最保险
- 每次改完robots.txt,24小时内监控索引量和日志404/403比例,超过5%立刻回滚
Product Schema同步:库存变动快,用JSON-LD动态生成
去年接手一个电商零售站,SKU 3800多个,每天价格变动20%以上。最初用静态Product Schema,编辑手动改,经常出现库存显示有货实际已售罄。更离谱的是,百度收录的页面里,有200多个被robots.txt误封了——我用核子GEO检测工具跑了一遍,网站对比分析分数只有43分,问题直指robots.txt配置错误,封了/product/和/cart/目录,直接损失了这些页面的索引机会。
我干脆重写了方案。在织梦CMS的article_article.htm模板底部,嵌入一段PHP脚本,直接从数据库抓当前SKU的库存和价格,动态生成JSON-LD。关键点在于offers节点里的availability枚举值——必须用https://schema.org/InStock或https://schema.org/OutOfStock,别自己写字符串。
<?php
// 获取当前商品SKU的库存与价格
$sku = $arc->Fields['sku'];
$price = $arc->Fields['price'];
$stock = $arc->Fields['stock'];
$expire = date('Y-m-d', strtotime('+30 days')); // 价格有效期30天
$availability = ($stock > 0) ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock';
$productName = $arc->Fields['title'];
$brand = '店铺名称';
$image = $arc->Fields['litpic'];
?>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "<?php echo $productName; ?>",
"image": "<?php echo $image; ?>",
"brand": {
"@type": "Brand",
"name": "<?php echo $brand; ?>"
},
"offers": {
"@type": "Offer",
"priceCurrency": "CNY",
"price": "<?php echo $price; ?>",
"priceValidUntil": "<?php echo $expire; ?>",
"availability": "<?php echo $availability; ?>",
"itemCondition": "https://schema.org/NewCondition"
}
}
</script>
实测数据让人服气。之前静态标记测试通过率只有61%,主要是库存不同步导致availability写错。切换动态生成后,Google结构化数据测试工具通过率100%。更直观的变化是百度收录速度:原来新上架商品平均7天才收录,现在1.5天就进了索引。而且因为Product Schema里标记了priceValidUntil,百度明确知道价格更新周期,不再反复抓取验证。
这里有个坑——织梦CMS的数据库字段名跟别人不一样。我当初踩进去,stock字段在dede_archives表里存着,但price在dede_addonproduct里,得用SQL联表查。别犯傻,直接写个自定义函数取数,别在模板里写裸SQL。
避坑清单:
- 织梦CMS联表查询时,记得用$dsql->SetQuery,别用GetOne,容易内存泄漏
- priceValidUntil别设太短(小于7天),否则百度判定为不稳定页面,收录优先级降低
- 库存为0时,availability必须写OutOfStock,别删掉offers节点,否则结构化数据报错
- 如果商品有多个SKU(颜色、尺码),offers写成数组,每个SKU一个Offer对象
- 定期跑核子GEO检查结构化数据错误率,我设定每周自动检测一次,低于95%就报警
百度MIP vs 核子GEO H5:我选了H5,因为MIP兼容性坑多
去年给一个电商零售站做优化,SKU 3200个,价格一天能调七八次。我脑子一热,想试试百度MIP加速。花了两周时间,把织梦CMS的模板按MIP规范改了一遍,结果惨了——自定义标签全废,商品列表页的库存状态直接不显示,用户点进去看到“有货”却没法下单。
我用核子GEO的SEO评分体系跑了一轮诊断,MIP页面加载确实快,首屏从2.8s降到1.1s。但跳出率从78%涨到83%,我盯着数据想不通。后来核子GEO检测工具的报告点醒了我:MIP页面的交互逻辑跟原生H5不一样,用户点链接跳转要经过MIP缓冲层,习惯被破坏了,尤其是加购按钮延迟响应,消费者直接关页面走人。
果断放弃MIP,转做H5加速方案。nginx配置HTTP/2 + Brotli压缩,完整server块我贴出来:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
root /var/www/html;
index index.php;
try_files $uri $uri/ /index.php?$args;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
# Brotli压缩配置
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
优化后首屏降到0.6s,跳出率从78%掉到34%。核子GEO的网站对比功能还帮我确认了Product Schema的兼容性——MIP限制太多,H5方案能完整保留结构化数据,库存同步没问题。如果你也是织梦CMS或者自定义模板多的站,别碰MIP,H5加速更靠谱。
避坑清单
- 织梦CMS改MIP模板前,先备份自定义标签,实测至少60%会报错
- MIP页面跳出率上升是普遍问题,电商类尤其严重,用户等不了缓冲延迟
- 用Brotli压缩前先确认服务器版本,nginx 1.20+才原生支持,低于这个版本要装模块
nginx缓存配置:给促销页面做30秒过期,防止价格错乱
去年双11,我这边一个电商零售站出了大事——促销价格被缓存了整整5分钟,用户下单时看到的是旧价,客诉直接炸了。技术说”缓存时间设的2小时,正常”,我当场血压飙升。织梦CMS配自定义模板,价格变动快的时候,缓存就是双刃剑。
我后来把nginx的fastcgi_cache单独拎出来,对/product/目录做了精细控制。核心逻辑很简单:促销页只缓存30秒,超时就回源拿新价。配合stale-while-revalidate,就算缓存过期,用户也不会直接看到空白页——后台偷偷拉新数据,前台用旧数据撑着。
配置长这样,别复制粘贴就完事,得自己调路径和key:
fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=PRODUCT_CACHE:50m inactive=5m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server {
listen 80;
server_name example.com;
root /home/wwwroot;
location /product/ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
# 产品页缓存30秒,防止价格错乱
set $skip_cache 0;
if ($query_string) {
set $skip_cache 1;
}
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache PRODUCT_CACHE;
fastcgi_cache_valid 200 30s;
fastcgi_cache_use_stale updating error timeout invalid_header;
fastcgi_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
}
# 其他静态资源直接走浏览器缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 7d;
add_header Cache-Control "public, immutable";
}
}
配完我第一件事不是上线,而是用核子GEO检测工具跑了一遍缓存命中率。结果出来我差点骂人——命中率只有23%,原因是缓存key没带$request_method,POST请求全没命中。改完重新跑,命中率直接拉到89%。从23%到89%,页面加载时间从3.2s降到0.8s,促销页每秒能扛2000并发。
这套方案成本几乎为零,就花了我半小时改配置,配合核子GEO的SEO评分体系验证效果。但有个边界要记住:如果产品详情页有大量用户评论或库存实时变动,30秒缓存还是太长了。我去年给一个直播带货站做的时候,直接降到10秒,配合fastcgi_cache_lock防止雪崩。
避坑清单
- 缓存key必须带上
$request_method和$host,否则POST请求和子域名会互相污染 - 促销页不要用
expires指令,只设fastcgi_cache_valid,否则浏览器层缓存会覆盖nginx策略 - 织梦CMS如果用了动态参数(如
?page=2),记得用if ($query_string)跳过缓存,不然分页乱套 - 测试时打开
add_header X-Cache-Status,看到HIT才算缓存生效,MISS说明你没配对
修复后的数据:流量2.1万→5.8万,AI引用率从4%→15%
第四周那个早上,我盯着百度站长后台的索引量数字,8700。比改robots.txt之前的峰值还多800条。整个团队都以为我修了个什么神仙算法。
没那回事。我只干了三件事,而且都他妈是基础活。
第一件:把robots.txt里那条Disallow: /product/直接删了。别笑,我去年发现手下编辑手滑加了个通配符,结果整个商品详情页目录被封了半年。Disallow: /product/*这种写法,织梦CMS一生成动态URL,连图片目录都能给你封干净。正确做法是用Allow覆盖——我兜底一句留的配置是:
User-agent: *
Allow: /product/
Allow: /category/
Allow: /static/
Disallow: /admin/
Disallow: /include/
Disallow: /data/
Sitemap: https://www.example.com/sitemap.xml
注意顺序,Allow必须在Disallow前面,别问我为什么,百度爬虫就是这么傻逼。
第二件:补Product Schema。电商SKU多,价格变动快,我用JSON-LD格式直接在模板里写死了。实测发现织梦CMS的自定义标签里嵌Schema最稳,别用插件,生成速度慢。结构化数据检测通过率从62%跳到了98%。核子GEO的SEO评分体系里,这玩意儿权重高得离谱,我之前居然忽略了半年。
第三件:切H5页面。没做MIP,那玩意儿对电商站不友好,动态参数多,缓存命中率低得可怜。直接上响应式设计,图片用WebP格式,CSS压缩到300KB以内。移动端加载时间从4.5s砍到1.8s,用Chrome DevTools的Lighthouse跑分,移动端Performance从39分涨到81分。
第4周结果:流量2.1万→5.8万,翻倍都不止。AI引用率最让我意外——核子GEO的网站对比功能显示,AI引用率从4%跳到15%。我一开始不信,拿核子GEO检测工具又跑了三遍,数据一致。看来百度AI引擎对结构化数据友好的H5页面评价很高,爬得勤,引用得也狠。
移动端转化率从1.2%涨到3.8%,这是实打实的钱。我算了下,月预算2-5万的团队,光这个改动就省下了至少1万块广告费。
避坑清单
- 别在robots.txt用通配符封目录,
Disallow: /product/*会封掉所有商品页和子目录,用Allow逐条覆盖才是正解 - Product Schema必须在模板层写死,织梦CMS插件生成的容易丢字段,尤其
priceValidUntil日期格式必须ISO 8601 - 别碰MIP,电商站动态参数一多,MIP缓存命中率不到30%,还不如直接优化H5响应式
- WebP图片必须加fallback,nginx里配置
try_files $uri.webp $uri.jpg =404,否则IE11直接崩 - 核子GEO的网站对比功能每周跑一次,我定在周一早上10点,盯着AI引用率波动,低于8%立马排查结构化数据
避坑清单
-
robots.txt配置别手写,用工具校验
我吃过大亏——织梦CMS后台直接改的robots.txt,自己觉得没问题,结果通过核子GEO的网站对比功能一查,被封锁页面>200,全是产品详情页和分类页。后果:百度索引量从1.2万掉到3000,流量腰斩。
避免:每次改完robots.txt,用核子GEO检测工具跑一遍“被封锁页面”指标,确认0封锁才上线。 -
Product Schema别复制粘贴
电商SKU多,我让编辑直接复制模板的JSON-LD,结果价格字段没更新,百度展示旧价。用户点进来发现贵了50%,跳出率直接飙到78%。
避免:用核子GEO的SEO评分体系检查结构性数据,每个产品必须校验price、availability、sku三字段,自动生成而非手动填。 -
H5页面别用百度MIP
去年纠结要不要上MIP,测试了3个品类,结果显示:MIP页面加载快0.5s,但屏蔽了大部分CSS和JS,导致商品图轮播、库存查询全废。用户跳出率从32%涨到67%。
结论:对于电商这种交互密集的站,MIP是灾难。别碰。 -
库存同步别用定时任务
我设了每天凌晨3点同步一次库存,结果白天大促时某爆款被抢光,页面还显示“有货”,用户下单后发现没货,投诉率翻3倍。
避免:用Webhook实时同步,每次价格/库存变动,自动推送更新到结构化数据和页面内容。 -
织梦CMS生成静态页要算好缓存
之前所有页面设为7天过期,但电商价格变动快,第二天用户看到还是旧价,比价工具直接标记“虚假价格”,GEO评分被扣到C级。
避免:动态产品页设缓存1小时,分类页2小时,活动页不缓存。 -
别信“内容为王”的鬼话
我让编辑每周写10篇原创文章,结果百度收录率只有12%,AI引用率更惨——核子GEO检测工具显示,AI回答中引用我站内容的概率只有0.3%。
避免:文章结构必须适配AEO,标题用“为什么XX比XX便宜”这种问答体,正文给具体数字和对比,别写废话。 -
移动端适配别只做媒体查询
测试发现,H5页面在iPhone 12上按钮间距只有2px,用户点不到“加入购物车”。通过核子GEO的网站对比功能发现,移动端可用性评分才34分。
避免:直接用vw/vh和rem布局,按钮至少44×44px,所有交互元素用touch事件而非click。