Files
qnc-webview-v3/server/README-SEO.md
2026-02-28 14:33:47 +08:00

10 KiB
Raw Blame History

SPA SEO 优化解决方案

📋 方案概述

针对 SPA 应用 SEO 问题,采用爬虫检测 + 静态 HTML 回退方案:

  1. 爬虫检测识别搜索引擎爬虫百度、Google、必应、搜狗等
  2. 静态 HTML:为爬虫提供预渲染的 HTML 模板,包含完整 TDK、OG、canonical、结构化数据
  3. 正常用户:继续使用 SPA体验不受影响

配置统一:服务端 SEO 模板内容与前端 src/composables/useSEO.js 保持一致(标题、描述、关键词、域名),域名默认为 https://www.quannengcha.com(全能查)。可通过环境变量 SEO_BASE_URL 覆盖。

🏗️ 项目结构

server/
├── crawler-detector.js              # 爬虫检测模块
├── middleware.js                    # SEO 中间件Express/Koa路由与 useSEO.js 一致
├── generate-seo-templates.cjs       # SEO 模板生成器(与 useSEO.js 同步)
├── server-example-express.js        # Express 服务器示例
├── nginx-www.quannengcha.com.conf     # 全能查 Nginx 配置quannengcha.com
├── nginx-www.tianyuancha.cn.conf    # 天远查 Nginx 配置tianyuancha.cn
├── nginx-www.tianyuandb.com.conf    # 天远数据 Nginx 配置tianyuandb.com
├── test-seo.js                      # SEO 端到端检测脚本
└── README-SEO.md                    # 本文档

public/
└── seo-templates/                   # SEO 静态模板目录(运行 generate 后生成)
    ├── index.html
    ├── agent-system-guide.html
    ├── inquire-riskassessment.html
    ├── inquire-companyinfo.html
    ├── inquire-preloanbackgroundcheck.html
    ├── inquire-marriage.html
    ├── inquire-backgroundcheck.html
    ├── inquire-homeservice.html
    ├── inquire-consumerFinanceReport.html
    ├── agent.html
    ├── help.html
    ├── help-guide.html
    ├── example.html
    ├── service.html
    ├── promote.html
    └── ...

🚀 快速开始

步骤1生成 SEO 模板

cd server
node generate-seo-templates.cjs
# 或 npm run generate

这会在 public/seo-templates/ 下生成所有页面的静态 HTML 模板,内容与 src/composables/useSEO.js 一致。

步骤2集成到你的服务器

选项A使用Express服务器

const express = require('express')
const SEOMiddleware = require('./server/middleware')

const app = express()

// 初始化SEO中间件
const seoMiddleware = new SEOMiddleware({
    templateDir: path.join(__dirname, 'public/seo-templates'),
    debug: true // 开发环境开启调试日志
})

// 应用SEO中间件必须在静态文件服务之前
app.use(seoMiddleware.express())

// 静态文件服务
app.use(express.static(path.join(__dirname, 'dist')))

// SPA路由处理
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, 'dist/index.html'))
})

选项B使用 Nginx

  • 全能查站点:参考 server/nginx-www.quannengcha.com.conf,将 rootserver_name、证书路径改为你的服务器路径。
  • 天远查站点:参考 server/nginx-www.tianyuancha.cn.conf
  • 部署时把 public/seo-templates/ 整目录上传到服务器 root 下的 static-pages/
# 复制并修改配置
cp server/nginx-www.quannengcha.com.conf /etc/nginx/sites-available/quannengcha
nano /etc/nginx/sites-available/quannengcha   # 修改 root、证书等

# 启用并重载
ln -s /etc/nginx/sites-available/quannengcha /etc/nginx/sites-enabled/
nginx -t && systemctl restart nginx

选项C使用Koa

const Koa = require('koa')
const serve = require('koa-static')
const SEOMiddleware = require('./server/middleware')

const app = new Koa()

// 应用SEO中间件
const seoMiddleware = new SEOMiddleware({
    templateDir: path.join(__dirname, 'public/seo-templates'),
    debug: true
})

app.use(seoMiddleware.koa())

// 静态文件服务
app.use(serve(path.join(__dirname, 'dist')))

app.listen(3000)

步骤3测试爬虫检测

# 模拟百度爬虫
curl -A "Baiduspider" http://localhost:3000/

# 模拟Google爬虫
curl -A "Googlebot/2.1" http://localhost:3000/

# 模拟普通用户
curl http://localhost:3000/

🔧 配置说明

爬虫检测器配置

crawler-detector.js 包含以下爬虫识别:

  • 中文搜索引擎百度、360、搜狗、必应、有道、搜搜、头条搜索
  • 国际搜索引擎Google、Bing、Yahoo
  • 社交媒体爬虫Facebook、Twitter、LinkedIn、WhatsApp等

你可以根据需要添加或修改爬虫模式:

// 在crawler-detector.js中添加新的爬虫模式
this.crawlerPatterns.push('your-custom-bot')

路由到模板映射

middleware.js 中配置路由与模板的对应关系:

this.routeTemplateMap = {
    '/': 'index.html',
    '/agent': 'agent.html',
    // 添加新的路由映射
    '/new-route': 'new-template.html'
}

模板生成配置

推荐:页面 SEO 以 src/composables/useSEO.js 为唯一来源;修改标题/描述/关键词时只改 useSEO.js 中的 routeConfigs,然后同步到服务端:

  • server/generate-seo-templates.cjspageSEOConfigs 中保持与 useSEO.js 一致(含新增路由与 BASE_URL)。
  • server/middleware.jsrouteTemplateMap 中为新路由添加映射。
  • 若用 Nginx在对应 conf 的 $seo_file 中增加 if ($uri = '/新路径') { set $seo_file 新模板.html; }

新增页面示例(generate-seo-templates.cjs

'new-template.html': {
    title: '页面标题',
    description: '页面描述',
    keywords: '关键词1,关键词2',
    url: 'https://www.tianyuandb.com/new-route'
}

📝 自定义模板

修改模板样式

编辑 generate-seo-templates.js 中的 generateHTMLTemplate 函数:

function generateHTMLTemplate(config) {
    return `<!DOCTYPE html>
    <html>
    <head>
        <!-- 头部信息 -->
        <style>
            /* 自定义样式 */
            body { ... }
        </style>
    </head>
    <body>
        <!-- 自定义内容 -->
    </body>
    </html>`
}

添加结构化数据

模板已包含基本的结构化数据JSON-LD格式如需扩展

const structuredData = {
    "@context": "https://schema.org",
    "@type": "WebPage",
    // 添加更多字段
    "breadcrumb": {
        "@type": "BreadcrumbList",
        "itemListElement": [...]
    }
}

🧪 验证SEO效果

使用在线工具

  1. 百度资源平台https://ziyuan.baidu.com/
  2. Google Search Consolehttps://search.google.com/search-console
  3. 必应网站管理员工具https://www.bing.com/webmasters

使用命令行工具与检测脚本

# 本地/线上 SEO 检测(会请求爬虫 UA 与普通 UA
cd server
SEO_TEST_URL=http://localhost:3000 node test-seo.js
# 或线上SEO_TEST_URL=https://www.tianyuandb.com node test-seo.js
# 查看爬虫看到的标题
curl -s -A "Baiduspider/2.0" https://www.tianyuandb.com/ | grep -o '<title>.*</title>'

# 检查 meta 与 canonical
curl -s -A "Googlebot" https://www.tianyuandb.com/ | grep -E '<meta name="description"|<meta name="keywords"|<link rel="canonical"'

# 检查结构化数据
curl -s -A "Baiduspider" https://www.tianyuandb.com/ | grep -A 20 'application/ld+json'

📊 维护建议

定期更新爬虫列表

搜索引擎爬虫的User-Agent可能会更新建议定期检查并更新

保持模板内容同步

useSEO.js 中页面 SEO 更新时,重新生成模板并部署:

cd server
node generate-seo-templates.cjs
# 将 public/seo-templates/ 上传到服务器对应目录

可选定时任务(例如每小时同步一次):

0 * * * * cd /path/to/tydata-webview-v2/server && node generate-seo-templates.cjs

监控爬虫访问

在服务器日志中监控爬虫访问情况:

# 查看百度爬虫访问
grep "Baiduspider" /var/log/nginx/access.log

# 查看Google爬虫访问
grep "Googlebot" /var/log/nginx/access.log

🐛 常见问题

Q1: 爬虫访问的是SPA还是静态HTML

检查响应头:

curl -I -A "Baiduspider" http://www.xingfucha.cn/

若看到 X-SEOMiddleware: prerenderedNode 中间件)或 X-SEOMiddleware: nginx-prerenderedNginx说明返回的是 SEO 静态 HTML。

Q2: 如何调试爬虫检测?

启用调试模式:

const seoMiddleware = new SEOMiddleware({
    templateDir: 'public/seo-templates',
    debug: true // 查看详细日志
})

Q3: 模板内容如何更新?

src/composables/useSEO.js 为准修改标题/描述/关键词,再在 server/generate-seo-templates.cjs 中同步 pageSEOConfigs,然后执行:

node generate-seo-templates.cjs

Q4: 如何处理动态内容?

静态模板只包含静态内容。如果需要包含动态数据,可以考虑:

  1. 预渲染服务:如 Prerender.io
  2. 服务端渲染:迁移到 Nuxt.js
  3. 混合方案:静态模板 + AJAX加载动态内容

Q5: 爬虫列表是否会误判?

如果某个用户被误判为爬虫,可以:

  1. 检查User-Agent是否包含爬虫关键词
  2. 在检测器中添加白名单
  3. 使用IP地址作为辅助判断

📚 参考资源

🆘 支持

如有问题,请检查:

  1. 模板目录是否存在:public/seo-templates/
  2. 模板文件是否生成:运行 node generate-seo-templates.js
  3. 服务器配置是否正确检查中间件或Nginx配置
  4. 爬虫User-Agent是否匹配查看检测器日志

📄 许可

本方案可自由使用和修改。