当前位置: 首页 > news >正文

vue-seo优化

一、为什么 Vue 需要专门做 SEO
      Vue 默认是客户端渲染 SPA,首屏 HTML 几乎为空,爬虫抓取不到内容;即使 Googlebot 能执行 JS,也存在“渲染预算”与加载延迟问题

二、技术落地 4 条路线

场景技术选型实现要点适用
内容更新频繁、SEO 高要求Nuxt3 SSRnpx nuxi@latest init my-seo-appuseHead() 设置 title/meta;useAsyncData()企业官网、电商
内容相对静态Nuxt3 SSGnuxt generate 一键生成纯静态文件;部署到 CDN 即可博客、文档
只想给几个关键路由做 SEO预渲染npm i prerender-spa-plugin -D;在 vue.config.js 中配置需要预渲染的路由即可 缺点:CSS和JS不可用活动页、落地页
已开发完的 SPA 不想重构动态渲染用 Puppeteer/Rendertron 针对爬虫返回静态 HTML;配合 Nginx UA 判断(最好选择:Puppeteer)旧项目应急

三、用 Puppeteer针对爬虫返回静态 HTML;配合 Nginx UA 判断

  描述:• 真人访问 → 正常返回 SPA 的 index.html
            • 爬虫访问 → 由 Rendertron(或 Puppeteer)渲染成静态 HTML 后返回

3.1 Puppeteer 渲染服务(Node)

# 安装
npm i express puppeteer

server.js

const express = require('express');
const puppeteer = require('puppeteer');const app = express();
let browser;(async () => {browser = await puppeteer.launch({headless: 'new',args: ['--no-sandbox', '--disable-setuid-sandbox']});
})();app.get('/render', async (req, res) => {const { url } = req.query;if (!url) return res.status(400).send('url required');const page = await browser.newPage();await page.setUserAgent('Mozilla/5.0 (compatible; PuppeteerRender/1.0)');await page.goto(url, { waitUntil: 'networkidle2' });const html = await page.content();await page.close();res.set('Cache-Control', 'public, max-age=300'); // 5 分钟 CDN 缓存res.send(html);
});app.listen(3001, () => console.log('Puppeteer render service on 3001'));

 运行

node server.js

测试:浏览器: http://localhost:3001/render?url=https://www.baidu.com(自己网址)

 或者 :curl http://localhost:3001/render?url=https://www.baidu.com(自己网址)

查看内容和浏览器渲染一样即可

3.2 nginx配置

map $http_user_agent $is_bot {default 0;~*Googlebot 1;~*Baiduspider 1;~*bingbot   1;~*Slurp     1;~*DuckDuckBot 1;
}
server
{listen 80;listen 443 ssl http2 ;server_name baidu.com;index index.html index.htm default.htm default.html;root /www/wwwroot/www_t.baidu.com;try_files $uri $uri/ /index.html;#CERT-APPLY-CHECK--START# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除并保持这段设置在优先级高的位置include /www/server/panel/vhost/nginx/well-known/tw.yougo.vip.conf;#CERT-APPLY-CHECK--END#REWRITE-ENDlocation / {proxy_set_header X-Original-Host $host;proxy_set_header X-Original-Request-URI $request_uri;proxy_set_header User-Agent $http_user_agent;# 1. 如果是爬虫 → 代理到 Puppeteerif ($is_bot) {proxy_pass http://127.0.0.1:3001/render?url=$scheme://$host$request_uri;# 传递必要头部break;}# 2. 真实用户 → SPAtry_files $uri $uri/ /index.html;}#禁止访问的文件或目录location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md){return 404;}#一键申请SSL证书验证目录相关设置location ~ \.well-known{allow all;}#禁止在证书验证目录放入敏感文件if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {return 403;}location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)${expires      30d;error_log /dev/null;access_log /dev/null;}location ~ .*\\.(js|css)?${expires      12h;error_log /dev/null;access_log /dev/null;}access_log  /www/wwwlogs/tw.yougo.vip.log;error_log  /www/wwwlogs/tw.yougo.vip.error.log;
}

主要的配置点是:

map $http_user_agent $is_bot {default 0;~*Googlebot 1;~*Baiduspider 1;~*bingbot   1;~*Slurp     1;~*DuckDuckBot 1;
}location / {proxy_set_header X-Original-Host $host;proxy_set_header X-Original-Request-URI $request_uri;proxy_set_header User-Agent $http_user_agent;# 1. 如果是爬虫 → 代理到 Puppeteerif ($is_bot) {#proxy_pass http://localhost:3001/render?url=$scheme://$host$request_uri;proxy_pass http://127.0.0.1:3001/render?url=$scheme://$host$request_uri;# 传递必要头部break;}# 2. 真实用户 → SPAtry_files $uri $uri/ /index.html;}

配置即可(注意配置时,不要使用localhost 这样nginx解析会出错)

测试:使用POSTMan测试

主要是User-Agent   Mozilla/5.0 (compatible; Baiduspider/2.0)

这样就可以模拟百度爬虫,进行访问

http://www.dtcms.com/a/284701.html

相关文章:

  • Android构建流程与Transform任务
  • 题解:P13311 [GCJ 2012 Qualification] Speaking in Tongues
  • java面向对象-多态
  • 【前端】Power BI自动化指南:从API接入到Web嵌入
  • 旅游管理实训基地建设:筑牢文旅人才培养的实践基石
  • LeetCode热题100—— 238. 除自身以外数组的乘积
  • Pygame创建窗口教程 - 从入门到实践 | Python游戏开发指南
  • 小白学Python,网络爬虫篇(1)——requests库
  • java Integer怎么获取长度
  • 【Jmeter】报错:An error occured:Unknown arg
  • 3.PCL点云合并
  • 为什么选择Selenium自动化测试?
  • 接口黑洞?破!安全堡垒?筑!冰火炼狱?战!MES7114W终极掌控
  • 学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
  • 三、CV_VGGnet
  • 栈和队列的实现,咕咕咕
  • CTF之栅栏密码的传统型、W型与偏移量
  • ota之.加密算法,mcu加密方式
  • 开源 python 应用 开发(八)图片比对
  • Android wifi简单白名单实现逻辑
  • 20250717在荣品的PRO-RK3566开发板的Android13系统下解决点屏出现问题unsupport command data type: 217
  • 通俗的解释一下以太网中的端口号
  • 流式数据处理实战:用状态机 + scan 优雅过滤 AI 响应中的 `<think>` 标签
  • 深入理解CSS定位:绝对定位的包含块机制
  • 退休时间计算器,精准预测养老时间
  • 项目实战(18)-POE分离器
  • Spring底层原理(一)核心原理
  • RCU机制及常见锁的理解
  • 深入理解Java中的Map.Entry接口
  • 【数据结构】单链表的实现