欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解在不使用ssr的情況下解決Vue單頁面SEO問題

 更新時間:2018年11月08日 14:15:17   作者:EEEEEZ  
這篇文章主要介紹了在不使用ssr的情況下解決Vue單頁面SEO問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

遇到的問題:

近來在寫個人博客的時候遇到了大家可能都會遇到的問題

Vue單頁面在SEO時顯得很無力,尤其是百度不會抓取動態(tài)腳本

Vue-Router配合前后端分離無法讓meta標簽在蜘蛛抓取時動態(tài)填充

Vue單頁面又是大勢所趨,寫起來也不止是一個爽,當然也可以選擇多頁面

但即使是多頁面在面對文章和文檔時候也不可能說給每篇文章生成個Vue頁面

SSR當然能解決這個問題,但是仔細想想SSR不就跟以前的.php頁面一樣了么

都是預(yù)先拉取所有數(shù)據(jù)然后填充返回給瀏覽器,需要多消耗服務(wù)器資源,而且配置繁瑣

當然預(yù)渲染也不能解決這個問題

那么問題來了,我只是想讓百度抓取下我的動態(tài)文章,但是配置個繁瑣的SSR并不是最好選擇

我的解決辦法:

既然只是想讓百度抓取下我的動態(tài)文章,其實就是讓蜘蛛抓取我的靜態(tài)頁面時候,html的meta標簽是已經(jīng)填充好的

那么就很簡單了,我們只需要實現(xiàn)一個極其簡單的閹割版的SSR不就好了么

PS:我百度了很久沒有找到相關(guān)的文章,不知道是不是我百度的姿勢不對😅

具體思路:

因為我的服務(wù)器后端語言是php,service是nginx,所以我這里展示的所有后端代碼都是基于php,大家當然可以選擇nodejs或者其他的語言去實現(xiàn),這里提供個簡單的思路

上面說到我們要實現(xiàn)個閹割版SSR,其實就是在服務(wù)器有請求過來的時候在靜態(tài)html的meta標簽上填充好數(shù)據(jù)然后返回給請求端

這里的實現(xiàn)都是基于已經(jīng)構(gòu)建好的Vue單頁面,所以請先構(gòu)建好一個Vue單頁面

先把構(gòu)建好的dist下的index.html改造下

在頂部將變量拿取到,因為接口都是現(xiàn)成的,所以偷個懶直接調(diào)取接口

<?php

$valDescription = '前端入門,進階總結(jié)記錄,個人日志博客,分享web學(xué)習經(jīng)驗的小窩。';
$valKeywords = 'web窩,前端,vue,js,博客,JavaScript,css,入門,教程';
$valTitle = 'web窩';

/**
 * 發(fā)送HTTP請求方法
 * @param string $url  請求URL
 * @param array $params 請求參數(shù)
 * @param string $method 請求方法GET/POST
 * @return array $data  響應(yīng)數(shù)據(jù)
 */
function http_Req($url, $params, $method = 'GET', $header = array("Content-type: text/html; charset=utf-8"), $multi = false){
  if($method == 'POST'){
    $header = ["Content-type: application/x-www-form-urlencoded"];
  }
  $opts = array(
    CURLOPT_TIMEOUT    => 30,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_HTTPHEADER   => $header
  );
  /* 根據(jù)請求類型設(shè)置特定參數(shù) */
  switch(strtoupper($method)){
    case 'GET':
      $opts[CURLOPT_URL] = $url . '?' . http_build_query($params);
      break;
    case 'POST':
      //判斷是否傳輸文件
      $params = $multi ? $params : http_build_query($params);
      $opts[CURLOPT_URL] = $url;
      $opts[CURLOPT_POST] = 1;
      $opts[CURLOPT_POSTFIELDS] = $params;
      break;
    default:
      throw new Exception('不支持的請求方式!');
  }
  /* 初始化并執(zhí)行curl請求 */
  $ch = curl_init();
  curl_setopt_array($ch, $opts);
  $data = curl_exec($ch);
  $error = curl_error($ch);
  curl_close($ch);
  if($error) throw new Exception('請求發(fā)生錯誤:' . $error);
  return $data;
}
//分割當前請求的路徑
$urlExp = explode('/',$_SERVER['REQUEST_URI']);
//如果當前的路徑是文章內(nèi)容
if(count($urlExp)>2 && $urlExp[1] == 'article'){
//請求當前文章的標題和描述
  $ret = json_decode(http_Req('http://127.0.0.1/api/Blog/getsinglelist',['tuid'=>$urlExp[2]],'POST'),true);
  $valKeywords = $ret['info'][0]['tt'].','.$valKeywords;
  $valDescription = $ret['info'][0]['txt'].' - '.$valTitle.','.$valDescription;
  $valTitle = $ret['info'][0]['tt'].' - '.$valTitle;
}
?>

將拿到的數(shù)據(jù)輸出到meta標簽上

<meta name="description" content="<?php echo $valDescription; ?>"/>
<meta name="keywords" content="<?php echo $valKeywords; ?>"/>

 
<title><?php echo $valTitle; ?></title>

然后把文件名改為index.php

寫的很糙,反正就只有這一個功能,先扔到這

我的service是nginx,Vue-Router是history模式,所以當有html請求過來的時候我把所有原先轉(zhuǎn)向index.html的請求都轉(zhuǎn)向到了index.php

這樣就實現(xiàn)了個閹割版的SSR

效果就像這樣 web窩

每篇文章刷新的時候相應(yīng)的meta標簽都會提前填充好數(shù)據(jù)

配合nginx實現(xiàn)Vue-Router的history模式

當然只有history模式才有SEO的意義

只需要將nginx配置里原先轉(zhuǎn)向index.html的地方改為index.php即可,Apache同理

location / {
  index index.php;
  alias /var/www/html/blog/;
  try_files $uri $uri/ /index.php;
}

關(guān)于后端接口請求的問題

因為我自己就一臺服務(wù)器,后端語言是php

php所用的框架也需要偽靜態(tài)

所以我的解決方式是用nginx配置根據(jù)二級域名,去代理所訪問的路徑

類似靜態(tài)資源訪問的都是cdn的二級域名,接口的請求訪問的都是api的二級域名

server {
  listen    80;
  listen   443 ssl;
  server_name cdn.linkvall.cn;
  root     /var/blog;
}
server {
  listen    80;
  listen   443 ssl;
  server_name api.linkvall.cn;
  root     /var/api;
}

當然你可以簡單的用請求的路徑去配置

server {
  listen    80;
  listen   443 ssl;
  server_name cdn.linkvall.cn;
  root     /var;

 
location ~ ^/api/ {
alias /var/api;
}

 
location ~ ^/blog/ {
alias /var/blog/;
}
}

這樣就可以把各自的資源路徑區(qū)分開

寫在最后

本來是打算用nodejs實現(xiàn)的,寫一個npm包,跑一個node進程,然后nginx把請求反向代理到node端口,這樣看上去更優(yōu)雅

不過轉(zhuǎn)念一想我的后端是php,直接代理到這個php文件可以省去寫npm包的時間,就是構(gòu)建好的html還要每次都更改下有一點點費勁,而且不優(yōu)雅

這里更多的是提供一個思路,后面有時間了或許我會寫一個npm包優(yōu)雅的實現(xiàn)它

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue組合式API的特點及使用方法

    Vue組合式API的特點及使用方法

    在Vue.js?3.0中,推出了新的組合式API,使得開發(fā)者能夠更加方便靈活地編寫Vue組件,這也是組合式?API?成為了?Vue?新的開發(fā)范式,與傳統(tǒng)的選項?API?相比,組合式?API?更加靈活、易于維護的原因,在本文中,我們將詳細介紹?Vue?組合式API的風格及使用
    2023-06-06
  • vue中封裝axios并實現(xiàn)api接口的統(tǒng)一管理

    vue中封裝axios并實現(xiàn)api接口的統(tǒng)一管理

    這篇文章主要介紹了vue中封裝axios并實現(xiàn)api接口的統(tǒng)一管理的方法,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-12-12
  • vue后臺返回格式為二進制流進行文件的下載方式

    vue后臺返回格式為二進制流進行文件的下載方式

    這篇文章主要介紹了vue后臺返回格式為二進制流進行文件的下載方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • python虛擬環(huán)境 virtualenv的簡單使用

    python虛擬環(huán)境 virtualenv的簡單使用

    virtualenv是一個創(chuàng)建隔絕的Python環(huán)境的工具。這篇文章主要介紹了python虛擬環(huán)境 virtualenv的簡單使用,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Vue項目中如何運用vuex的實戰(zhàn)記錄

    Vue項目中如何運用vuex的實戰(zhàn)記錄

    如果說是JQuery是手工作坊,那么Vue.js就像是一座工廠,雖然Vue.js做的任何事情JQuery都可以做,但無論是代碼量還是流程規(guī)范性都是前者較優(yōu),下面這篇文章主要給大家介紹了關(guān)于Vue項目中如何運用vuex的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 關(guān)于Vue中使用alibaba的iconfont矢量圖標的問題

    關(guān)于Vue中使用alibaba的iconfont矢量圖標的問題

    這篇文章主要介紹了Vue使用alibaba的iconfont矢量圖標的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • vite打包拆分js和css的配置指南

    vite打包拆分js和css的配置指南

    這篇文章主要給大家介紹了關(guān)于vite打包拆分js和css的配置指南,Vite是一個非??焖俚墓ぞ?它可以幫助你打包JavaScript文件,需要的朋友可以參考下
    2023-09-09
  • vue圓環(huán)百分比進度條組件功能的實現(xiàn)

    vue圓環(huán)百分比進度條組件功能的實現(xiàn)

    在一些頁面設(shè)置進度條效果給人一種很好的體驗效果,今天小編教大家vue圓環(huán)百分比進度條組件功能的實現(xiàn)代碼,代碼超級簡單啊,感興趣的朋友快來看下吧
    2021-05-05
  • vue.js this.$router.push獲取不到params參數(shù)問題

    vue.js this.$router.push獲取不到params參數(shù)問題

    這篇文章主要介紹了vue.js this.$router.push獲取不到params參數(shù)問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03
  • vue中使用/deep/失效的解決方法

    vue中使用/deep/失效的解決方法

    這篇文章主要介紹了vue中使用/deep/失效的解決辦法,使用了css預(yù)處理器,則可以使用/deep/, 如果/deep/ 無效,則使用 ::v-deep,本文給大家講解的非常詳細需要的朋友可以參考下
    2022-11-11

最新評論