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.pswp.cn/bicheng/89463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89463.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DNS防護實戰:用ipset自動攔截異常解析與群聯AI云防護集成

問題場景 DNS服務器常成為黑客探測源IP的首選目標。攻擊者通過高頻DNS查詢獲取解析記錄,或利用異常請求觸發服務器響應,從而定位源站IP。傳統單IP攔截效率低下,難以應對分布式攻擊。 核心解決方案 ipset自動化攔截 ipset是iptables的擴展&…

養老院跌倒誤報頻發?陌訊時空圖卷積實現95%精準檢測

?開篇痛點??> "傳統視覺算法在養老院場景面臨三大挑戰&#xff1a; > ① 夜間低光照下識別率驟降&#xff08;<50% mAP&#xff09; > ② 多人遮擋場景姿態檢測漂移 > ③ 跌倒誤報率高達30%&#xff08;某養老機構2024年報告&#xff09;"通…

[spring6: BeanPostProcessor BeanFactoryPostProcessor]-生命周期

BeanFactoryPostProcessor BeanFactoryPostProcessor 接口允許在 Spring 容器初始化完所有的 bean 定義之后&#xff0c;但還未實例化任何 bean 時&#xff0c;修改應用上下文的內部 bean 工廠。通過實現 postProcessBeanFactory 方法&#xff0c;你可以覆蓋或添加屬性&#xf…

MISRA C-2012準則之聲明與定義

目錄 一、MISRA C簡介 二、聲明與定義 1. 必需。類型應被顯式聲明。 2. 必需。函數應以原型形式命名參數。 3. 必需。所有對象和函數的聲明需要使用完全相同的名字和參數。 4. 必需。當定義有外部鏈接的對象或函數時&#xff0c;兼容聲明應是可見的。 5. 必需。外部變量…

【blender】使用Vscode進行blender調試

配置vscodeblender 直接使用blender中的text editor沒有代碼補全&#xff0c;終端輸出通常和blender不在同一個頁面&#xff0c;只適合非常簡單的代碼測試。使用Vscode能有效提高blender調試的效率&#xff0c;具體方式見&#xff1a;VSCode 開發 Blender腳本工具配置。 調試…

Au速成班-樂理知識補充+網頁下載音樂

音質分類 通過查看音頻頻譜&#xff0c;128Kbps、192Kbps、320Kbps、無損&#xff08;Lossless HD&#xff09;CD音質&#xff08;頻率都在20kHz以上&#xff09;。 各家平臺對無損的定義不一樣&#xff0c;em各有說法吧。 無損的含義是&#xff1a;無損失的聲音格式。只要能…

JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它實現類的常用方法

文章目錄前言一、Collection 接口常用方法1.boolean add(E e)2.boolean remove(Object o)3.boolean contains(Object o)4.boolean isEmpty()5.int size()6.void clear()7.Object[] toArray()8.boolean containsAll(Collection<?> c)9.boolean addAll(Collection<? e…

有n棍棍子,棍子i的長度為ai,想要從中選出3根棍子組成周長盡可能長的三角形。請輸出最大的周長,若無法組成三角形則輸出0。

題目描述&#xff1a; 有n棍棍子&#xff0c;棍子i的長度為ai&#xff0c;想要從中選出3根棍子組成周長盡可能長的三角形。請輸出最大的周長&#xff0c;若無法組成三角形則輸出0。 算法為O(nlogn) 初始理解題目 首先&#xff0c;我們需要清楚地理解題目要求&#xff1a; 輸入…

【Echarts】 電影票房匯總實時數據橫向柱狀圖比圖

效果圖code <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>圓角柱狀圖</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script> </head> <…

【深度學習基礎】PyTorch中model.eval()與with torch.no_grad()以及detach的區別與聯系?

目錄1. 核心功能對比2. 使用場景對比3. 區別與聯系4. 典型代碼示例(1) 模型評估階段(2) GAN 訓練中的判別器更新(3) 提取中間特征5. 關鍵區別總結6. 常見問題與解決方案(1) 問題&#xff1a;推理階段顯存爆掉(2) 問題&#xff1a;Dropout/BatchNorm 行為異常(3) 問題&#xff1…

博客摘錄「 華為云平臺-FusionSphere OpenStack 8.2.1 系統加固」2025年7月15日

編號 加固項 "風險 等級" 加固原理/Rationale 審計方法/Audit 期望結果/Expect Results 加固方法/Remediation 1 OpenSSH加固配置 1.1 OpenSSH加固配置 1.1.1 SSH使用的版本 H "Op…

永磁同步電機MTPA與MTPV曲線具體仿真實現

永磁同步電機MTPA與MTPV曲線具體仿真實現 近期做了一些標定試驗&#xff0c;實際電機參數并不是確定的&#xff0c;而是變化的&#xff0c;因此很難通過解析的方法算出MTPA的對應點&#xff0c;以及在弱磁區如何過度到MTPV。這個在實際情況下都是一點點標出來的&#xff0c;我這…

Adobe Acrobat 插件功能、應用與開發

什么是 Acrobat 插件&#xff1f; Adobe Acrobat 插件是一種能夠擴展 Adobe Acrobat 閱讀器/查看器功能的軟件組件。Acrobat 是用于查看、創建和編輯 PDF 文檔的流行程序&#xff0c;而插件可以為其添加新功能&#xff0c;例如&#xff1a; #mermaid-svg-iqdM1wLkFQhd3ilQ {fon…

Redis學習系列之——高并發應用的緩存問題(二)

一、布隆過濾器布隆過濾器由一個 BitMap 和若干 Hash 函數組成&#xff0c;可以用來快速判斷一個值是否存在后端存儲中。它是解決 Redis 緩存穿透問題的一個不錯的解決方案。工作原理步驟1&#xff1a;當 key-value 鍵值對存儲到 Redis 后&#xff0c;向布隆過濾器添加 key步驟…

Expression 類的靜態方法

public static MethodCallExpression Call(Type type, // 包含目標方法的類型string methodName, // 方法名稱Type[]? typeArguments, // 泛型方法的類型參數&#xff08;非泛型方法為 null&#xff09;params Expression[]? arguments // 方…

[Nagios Core] 事件調度 | 檢查執行 | 插件與進程

第五章&#xff1a;事件調度 歡迎回到Nagios Core&#xff01; 在上一章第四章&#xff1a;配置加載中&#xff0c;我們了解了Nagios如何讀取配置文件以知曉需要監控的對象&#xff0c;比如我們的朋友"Web Server 1"。此時Nagios內存中已構建完整的基礎設施拓撲圖。…

Web3 常用前端庫介紹

一、Web3 前端開發&#xff1a;連接用戶與區塊鏈的橋梁 隨著 Web3 生態的蓬勃發展&#xff0c;前端開發從傳統的頁面渲染進化為區塊鏈交互的核心樞紐。Web3 前端庫作為連接用戶與區塊鏈的橋梁&#xff0c;承擔著錢包集成、合約交互、數據可視化等關鍵功能。本文將系統解析主流 …

cnpm命令報internal/modules/cjs/loader.js:797 throw err; ^ Error: Cannot find

在運行一個項目的時候&#xff0c;需要升級電腦各組件的版本&#xff0c;結果導致cnpm命令無法正常使用&#xff0c;cnpm任何命令都會報如下這個錯&#xff1a;找了半天&#xff0c;發現是由于cnpm與npm的版本不一致導致的&#xff0c;所以需要卸載并重新安裝cnpm&#xff0c;重…

15、鴻蒙Harmony Next開發:創建自定義組件

目錄 自定義組件的基本用法 自定義組件的基本結構 struct Component freezeWhenInactive build()函數 Entry EntryOptions Reusable 成員函數/變量 自定義組件的參數規定 build()函數 自定義組件生命周期 自定義組件的創建和渲染流程 自定義組件重新渲染 自定義…

深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()

文章目錄深入理解Map.Entry.comparingByValue()和Map.Entry.comparingByKey()1. 方法定義comparingByKey()comparingByValue()2. 基本用法2.1 使用comparingByKey()2.2 使用comparingByValue()3. 方法重載版本comparingByKey(Comparator)comparingByValue(Comparator)4. 高級用…