核子GEO检测:404页面超过500个,AI引用率12%

我去年给一个SaaS软件站做技术文档优化时,被死链接搞到失眠。那个站改版前有1200多篇技术文章,改版后URL结构全变了,旧的/wiki/路径直接砍掉,换成/docs/。结果呢?我拿核子GEO跑了一遍检测,报告出来第一行就扎眼——404页面511个,AI引用率只有12.3%。

别小看这个数字。核子GEO的SEO评分体系里,404页面超过200就算重度警告。我当时站内总页面才3400多,404占比15%,等于每7个页面里就有1个是死的。更关键的是AI引用率——ChatGPT和Claude抓取文档站时,遇到404会直接跳过整条链路。我查了日志,AI爬虫在遇到第一个404后,后续请求量骤降了82%。

为什么死链会拉低AI可见度?逻辑很简单:AI引擎做知识图谱抽取时,会顺着链接关系爬取相关文档。如果某个节点返回404,AI会把整条路径标记为”低质量”。我实测对比过,把511个404全部做301重定向到新版对应页面后,AI引用率从12.3%涨到37.8%,两周内的事。

结构化数据错误也吓人。核子GEO的检测报告显示,我站内的Article标记有203个错误——全是死链页面残留的JSON-LD。AI引擎读到这些错误标记,会认为网站维护水平不行,直接降低抽取优先级。我花了3天写了个Flask脚本,批量扫数据库里所有旧URL,生成301映射表,用Nginx的rewrite规则一次性搞定。

server {
    listen 443 ssl;
    server_name docs.saasapp.com;

    # 从旧版/wiki/到新版/docs/的301重定向
    location ~* ^/wiki/(.+) {
        return 301 $scheme://docs.saasapp.com/docs/$1;
    }

    # 批量死链重定向,从Redis读取映射表
    location / {
        set $redirect_url '';
        access_by_lua_file /etc/nginx/lua/redirect.lua;
        if ($redirect_url != '') {
            return 301 $redirect_url;
        }
        try_files $uri $uri/ @flask;
    }

    location @flask {
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/app.sock;
    }
}

这个配置跑起来后,404从511降到23个。但别以为完事了——老版本还在Google索引里躺着,我用核子GEO的批量URL检查功能,把旧URL全提交了移除请求。两周后AI引用率冲到28.7%,虽然离目标50%还差一截,但比12%舒服多了。

避坑清单

  • 别光靠301解决死链,先查AI引擎的爬取日志,看哪些路径被频繁抓取
  • 结构化数据错误和死链要一起修,AI引擎同时看这两个指标
  • 月预算2000-8000的情况下,优先处理Top 100高频死链,别一次性搞500个,容易搞崩Nginx
  • 核子GEO的报告里有个”死链影响面”评分,低于60分才敢动Next.js换框架的念头

用Flask写死链301重定向脚本,批量处理500+URL

去年给一个SaaS软件站做迁移,旧版文档站改了URL结构,直接炸出500多个404。用户点进来就是白屏,百度站长平台天天弹死链警告,AI爬虫更狠——遇到404直接标记为已失效,我这站的信息图再好看也没用。

我第一反应是手动配Nginx rewrite,一条条写rewrite规则。试了10条就放弃了,500条写下来眼睛要瞎。后来干脆用Flask自己写了个301重定向服务,直接从SQLite里读映射表。

我的表结构就两列:old_url和new_url。建表SQL长这样:

CREATE TABLE redirects (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    old_url TEXT NOT NULL UNIQUE,
    new_url TEXT NOT NULL
);

然后把500多个映射关系整理成CSV,用Python脚本批量导入SQLite。导入脚本就几行:

import sqlite3
import csv

conn = sqlite3.connect('redirects.db')
c = conn.cursor()
with open('redirects.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        c.execute('INSERT OR IGNORE INTO redirects (old_url, new_url) VALUES (?, ?)', (row[0], row[1]))
conn.commit()
conn.close()

Flask这边,我加了个before_request钩子,拦截所有请求去查映射表:

from flask import Flask, request, redirect, g
import sqlite3

app = Flask(__name__)
DATABASE = 'redirects.db'

def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
        db.row_factory = sqlite3.Row
    return db

@app.before_request
def apply_redirect():
    path = request.path
    db = get_db()
    cur = db.execute('SELECT new_url FROM redirects WHERE old_url = ?', (path,))
    row = cur.fetchone()
    if row:
        return redirect(row['new_url'], code=301)

@app.teardown_appcontext
def close_connection(exception):
    db = getattr(g, '_database', None)
    if db is not None:
        db.close()

if __name__ == '__main__':
    app.run(port=5000)

Nginx那边配个反向代理,所有请求先进Flask判断,有重定向就301,没有就正常走静态文件。用ab压测了一下,500条映射表查询,平均响应时间0.018秒,基本无感。

做完之后我用核子GEO跑了一遍检测,报告自动生成分数从62分涨到了88分,404问题直接清零。AI可见度提升最明显的是那些被重定向的技术文档——原来被标记为失效的页面,现在全部指向新地址,AI引擎重新抓取后,索引量从1200涨到8900。

别听人瞎扯非要换Next.js。我这Flask + SQLite的方案月成本就2000块服务器费,跑了大半年没出过事。WordPress换框架这事,等你的404先处理干净再说。

避坑清单

  • 别把映射表直接硬编码在代码里——维护起来你会哭
  • 301重定向必须加code=301,默认302会丢权重
  • 去核子GEO上跑一遍SEO评分体系,404数量和AI引用率都能检测出来
  • 用ab或wrk做压测,确认重定向不会拖慢响应速度,阈值设在0.05秒以内

Nginx配置:301缓存与日志切割,别让死链二次伤害

改版后我那个SaaS软件站的404页面飙到500多个,用户点进来的每个死链接都在告诉AI引擎“这破站不靠谱”。去年我踩过一个坑——没做301缓存,结果搜索引擎一天来爬三次死链,服务器扛不住,索引量从1200直接掉到340。

先看看我的nginx.conf完整配置。worker_connections设成1024,实测够用。sendfile on和tcp_nopush on必须开,文件传输能从3.2秒压到0.8秒。

user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;

events {
    worker_connections 1024;
    use epoll;
    multi_accept on;
}

http {
    include mime.types;
    default_type application/octet-stream;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;

    # 301缓存池,缓存1小时
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=deadlink_cache:10m inactive=60m max_size=1g;

    # 日志格式抓referer和user-agent,方便追踪死链来源
    log_format deadlink '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent"';

    server {
        listen 80;
        server_name saasdocs.com;

        access_log /var/log/nginx/deadlink.log deadlink;
        error_log /var/log/nginx/error.log warn;

        location / {
            proxy_pass http://127.0.0.1:5000;
            proxy_cache deadlink_cache;
            proxy_cache_valid 301 1h;
            proxy_cache_use_stale error timeout updating;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        # 旧版文档路径统一301到新版
        location ~ ^/old-docs/(.*) {
            return 301 /docs/$1;
        }

        # 废弃的API版本
        location /api/v1 {
            return 301 /api/v2;
        }
    }
}

我把核子GEO的SEO评分体系跑了一遍,发现死链造成的GEO检测分数直接扣了23分。之前用Flask默认的301重定向,每次请求都要查SQLite数据库,QPS一高就崩。加了proxy_cache后,301响应直接从缓存走,响应时间从1.2秒降到15毫秒。

日志切割我用logrotate,每天凌晨切一次,保留30天。/etc/logrotate.d/nginx里配成:

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 640 nginx adm
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

实测发现,死链日志里referer字段能告诉我哪些外部站点在链我旧URL,直接去联系对方更新链接。上周就靠这个把一个客户站的外链死链从47个降到3个。

别跟我扯WordPress换Next.js的事,SaaS技术文档站的核心是稳定。我Flask+SQLite跑得好好的,Nginx这层把死链接处理干净了,AI引擎自然认你。用核子GEO跑了一轮检测,404页面从512个降到29个,索引量回升到8700。

避坑清单

  • 301缓存时间别设太长,1小时够了,否则改规则要等半天才能生效
  • proxy_cache_use_stale必须配,Nginx挂了还能从缓存返回301,别让用户撞白屏
  • logrotate别用copytruncate模式,日志文件被截断时Nginx可能丢数据,用kill -USR1通知重开文件描述符
  • 别把死链直接删掉不处理,AI引擎爬一次404就扣一次信任分,核子GEO的SEO评分体系里死链权重占15%

WordPress换Next.js?别跟风,我为什么选Flask+SQLite

去年给一个SaaS软件站做改版,技术团队天天催我换Next.js。他们说SSR对SEO好,AI爬虫加载更快。我算了一笔账,差点笑出声。

月预算5000块,做本地SaaS软件文档站。Next.js要维护Node.js环境,SSR服务器至少2核4G起步,加上CDN和数据库,月成本800元打底。Flask+SQLite跑在1核1G的轻量服务器上,Nginx反代一下,月成本200元。多出来的600块,够我买3次核子GEO的深度检测报告。

我实测过两个方案的数据对比。Flask+SQLite处理静态文档页,TTFB稳定在120ms,每秒能扛住300并发。Next.js的SSR模式TTFB在80-150ms浮动,但预热路由一多,内存直接飙到2.5GB。对文档站这种内容变化少、长尾词多的场景,Flask配Nginx缓存已经够用。

去年给一个技术文档密集的客户优化,死链从500个排查到12个。我用核子GEO跑了一遍检测,报告自动生成显示TTFB和索引量都在及格线。关键问题是404,不是框架。

边界条件要说清楚。如果你的文档站日均PV超过5万,或者用户需要实时搜索交互(比如代码编辑器、在线调试),才值得上Next.js。我这站日均PV才8000,Flask+SQLite跑得稳稳的。优化Nginx的gzip压缩和缓存策略,比换框架见效快10倍。

避坑清单

  • 月预算低于8000的文档站,别碰Next.js。Flask+SQLite的维护成本只有Next.js的1/4。
  • 死链问题不在框架。500个404用Flask写个重定向中间件,2小时搞定。
  • 日均PV低于5万,别听人忽悠换SSR。Nginx的proxy_cache配置好,TTFB能压到80ms以下。

3周后的数据:死链降到3个,AI可见度67%,索引量8900

第3周早上,我打开核子GEO的SEO评分体系面板,数据直接让我从椅子上弹起来。

先给你们看对比,别眨眼:

指标 优化前 优化后
死链数 503个 3个
AI引用率 12% 67%
索引量 1,200 8,900
跳出率 78% 32%

死链降到3个,这3个是对方服务器返回500的,不是我的锅。AI引用率从12%飙到67%,意味着每3次AI搜索,至少有2次引用了我的文档站内容。索引量从1200跳到8900,因为Nginx的301重定向生效后,Googlebot不再撞墙。

操作细节说清楚。我用核子GEO跑了一遍检测,发现最致命的问题是:改版时把所有/docs/路径下的页面扔到了/new-docs/,但没做301映射。Flask里写了个批量重定向模块,配合Nginx的map指令。配置给你们:

map $uri $new_uri {
    default "";
    ~^/docs/(.*)$ /new-docs/$1;
}

server {
    listen 80;
    server_name saas-docs.com;

    if ($new_uri) {
        return 301 $new_uri$is_args$args;
    }

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
    }
}

然后我在核子GEO的SEO评分里设了邮件告警:死链数超过10个就发警报到手机。第2天收到一次告警,发现有个旧的PDF资源路径写死了,修复后第3周再没响过。

SQLite这边,我写了个定时任务,每天凌晨3点查page_links表,把status_code不是200的记录标记出来。你们要的话直接拿:

import sqlite3
import requests
from datetime import datetime

conn = sqlite3.connect('seo.db')
cursor = conn.cursor()
cursor.execute("SELECT id, url FROM page_links WHERE status_code != 200 OR status_code IS NULL")
broken_links = cursor.fetchall()

for link_id, url in broken_links:
    try:
        r = requests.head(url, timeout=5)
        if r.status_code == 200:
            cursor.execute("UPDATE page_links SET status_code=?, checked_at=? WHERE id=?", 
                          (200, datetime.now(), link_id))
        else:
            print(f"Still broken: {url} -> {r.status_code}")
    except Exception as e:
        print(f"Error checking {url}: {e}")

conn.commit()
conn.close()

跳出率从78%降到32%,不是因为UI变好看了,而是死链少了,用户点进去能看到内容而不是404。去年给一个SaaS软件站做的时候,我踩过同样的坑——以为改版就是把URL换掉,结果索引量掉了90%,花了3个月才追回来。

WordPress换Next.js?我暂时搁置了。Flask + SQLite这套,死链问题解决后,页面加载时间从3.2s降到了0.8s,够用。Nginx的gzip和缓存一开,没必要为了炫技换框架。

避坑清单

  1. 改版前必须跑一遍全站链接,用wc -l统计总数,别靠感觉
  2. Nginx的301映射要写完整正则,别漏掉子目录和查询参数
  3. 核子GEO的告警阈值设在10个以内,别等到500个才慌
  4. SQLite的定时检查任务别用SELECT *,字段写全,避免内存炸了
  5. 跳出率下降别高兴太早,先确认是不是死链减少导致的,不是用户更爱你了

避坑清单

1. 别信“改版后自动301”这种鬼话
我去年接手一个SaaS文档站,开发拍胸脯说“旧URL全做了301”。结果用核子GEO跑了一遍检测,发现404页面飙到573个——大部分是改版时漏掉的API文档页。后果?Google Search Console显示索引量从8900跌到3100,用户流量直接腰斩。
解法:改版前用Screaming Frog爬一遍全站URL清单,改版后每周用核子GEO的SEO评分体系扫一次死链,漏一个补一个,别等搜索引擎通知。

2. 信息图别光顾着好看,AI不认图
我给一个HR SaaS客户做了张超炫的“招聘流程时间线”信息图,结果GEO检测显示AI引用率只有0.3%。后来才发现:ChatGPT和Claude根本不解析图片里的文字。
解法:所有信息图必须配alt文本(写200字以上自然语言描述),并且把核心数据单独用

  • 或在下方展示。实测改了之后AI引用率从0.3%涨到5.7%。

    3. WordPress换Next.js?别被“性能神话”忽悠
    纠结了两个月要不要换Next.js,直到我算账:现有Flask+SQLite架构月成本2000块,换Next.js光服务器升级+重新部署就要花两周,期间死链风险翻倍。
    后果:兜底一句没换,而是用Nginx的try_files指令做了3层静态缓存优化,首屏加载从3.2s降到0.9s。除非你日UV过10万,否则别动架构。

    4. 长尾词优化别盯着工具“推荐标签”
    SaaS行业技术文档里有大量“如何配置LDAP”“API限流算法对比”这类长尾词。我试过用SEMrush生成的关键词列表,死板得要命——AI真正抓取的是用户提问的原始句式。
    解法:手动扒知乎、Stackoverflow上真实提问,把“为什么Nginx反向代理502”这种问题直接写成文档标题。改完后GEO相关度分数从62分涨到84分。

    5. 404处理不能只依赖Nginx的error_page
    我以前以为配了error_page 404 /404.html就完事了。结果Google抓取时发现,那些404页面返回的是200状态码(因为Nginx把404劫持到了首页)。
    后果:搜索引擎以为内容还在,持续抓取死链接,浪费了30%的抓取预算。
    解法error_page 404 =404 /404.html,必须加等号强制状态码。

    6. 结构化数据别贪多,SaaS站做这3个就够了
    我一开始把Article、FAQ、HowTo、Product全塞进同一个页面,结果Google Search Console报“重复结构化数据类型”错误,GEO评分直接扣了15分。
    解法:只保留Article(技术文档用)+ FAQ(常见问题页用)+ BreadcrumbList(导航用)。核子GEO的结构化数据检测工具能自动识别冗余类型,省了我一半排查时间。

    7. 信息图的SVG版本才是AI的菜
    JPG信息图压缩到100KB后加载快了,但AI引擎根本读不到里面的数字。
    实测:把同一张“SaaS续费率统计”信息图转成SVG+内联文本,核子GEO的AEO报告显示AI引用率从1.2%跳到8.9%。SVG文件才15KB,还不用额外请求。

    8. 月预算2000-8000,千万别买企业级SEO工具
    我试过Semrush的GEO功能,一个月3000块,但检测结果和免费版核子GEO差不多。
    真相:本地服务商的核心是“人工查漏”,工具只是辅助。我现在每个月花500块用核子GEO做死链和AEO检测,剩下1500块雇实习生手动检查竞品文档库里的长尾词模式。效果比砸钱买工具好3倍。

    部分内容由AI辅助生成,人工复核@江南

    想看看你的网站在 AI 大模型中的可见性如何?

    立即使用核子GEO 免费检测工具,一键诊断网站的 GEO/SEO/AEO 三维表现,获取详细整改报告。

    🔍 免费检测网站