使用Prerender.io為angular項目做SEO

來源:互聯網
上載者:User

標籤:

現在的項目的為了更好的分工明確,降低耦合都開始採用前後端分離的形式進式開發,我們也採用這種開發形式,前端用angular開發。雖說剛開始也遇各種坑,但是後期熟悉了之後簡直爽呆。一個比較大的坑就是SEO問題,前後端分離頁面的路由一般都是放在前端的,用hashBang的方式控制路由。但是這會出現一種情況頁面無法被搜尋引擎抓取,這對於SEO簡直就是災難。有問題就有解決辦法,一般的做法就是在伺服器加一個可以渲染出靜態頁面的中介軟體,類似於phantomjs,zimbile.js,只要發現是搜尋引擎的蜘蛛來爬的話就返回靜態頁面。而Prerender.io就一個現成的工具。 Prerender.io 是一個相容多種不同平台(包括Node,PHP和Ruby)的一個服務。該服務是完全開源的,但是如果你不想搭建一個你自己的SEO伺服器的話,你可以使用他們提供的解決方案。Prerender的人們認為,SEO是一件正確的事,並不是一個特權,他們已經做了一些了不起的工作來擴充他們的解決方案,添加了很多自訂的功能和外掛程式。  下面我們就來看看如何使用:  前端(用戶端)配置
url中#的形式

在定義了AngularJS代碼的app.js中,我們需要這句代碼添加到我們的路由配置中:$locationProvider.hashPrefix(‘!‘); 這個方法會重寫你的URL。相對於標準的地址http://localhost:3000/#/home你的url地址看起來將會是類似http://localhost:3000/#!/home 的形式

如果你使用的是html5模式(html5Mode),你不會看到任何區別。

URL裡面的#!非常重要,因為它會告訴爬蟲你的程式有AJAX內容,需要它做一下AJAX抓取轉換。

angular.module(‘myApp‘).config([      ‘$locationProvider‘,    function($locationProvider) {        $locationProvider.hashPrefix(‘!‘);    }]);

google等搜尋引擎會識別帶‘#!‘的地址把它轉變為‘?_escaped_fragment_=’。

比如,Google發現的地址 

http://www.example.com/#!/user/123

它會向伺服器發送這種請求

http://www.example.com/?_escaped_fragment_=/user/123

 

url中沒有#的形式(採用html5 push state ) 1.配置index.html 要在首頁的<head>中<meta name="fragment" content="!">。這個meta標籤將告訴搜尋引擎的爬蟲,這個網站有動態JavaScript內容需要爬取。<base href="/"> 2.配置app.js 相比上邊的配置會多一行代碼。
angular.module(‘myApp‘).config([      ‘$locationProvider‘,    function($locationProvider) {        $locationProvider.hashPrefix(‘!‘);        $locationProvider.html5Mode(true);    }]);    
如果採用html5mode的形式,Google發現url後會在後邊加上?_escaped_fragment_= 比如,Google發現的地址
http://www.example.com/user/123
會發送這樣的請求 
http://www.example.com/user/123?_escaped_fragment_= 

伺服器端配置 首先在https://prerender.io 註冊一個帳號並擷取token。它的官網上有多種環境的配置,比如node.js、ruby、nginx、apache等等,這裡就只說apahce的配置。它提供的是.htaccess的設定檔,所以先確認是否已經啟用.htaccess檔案。然後在.htaccess檔案中加入以下配置
<IfModule mod_headers.c>    RequestHeader set X-Prerender-Token "your token"</IfModule><IfModule mod_rewrite.c>    RewriteEngine On    # Don‘t rewrite files or directories    RewriteCond %{REQUEST_FILENAME} -f [OR]    RewriteCond %{REQUEST_FILENAME} -d    RewriteRule ^ - [L]    <IfModule mod_proxy_http.c>                RewriteCond %{HTTP_USER_AGENT} baiduspider|facebookexternalhit|twitterbot|rogerbot|linkedinbot|embedly|quora\ link\ preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator [NC,OR]        RewriteCond %{QUERY_STRING} _escaped_fragment_                # Only proxy the request to Prerender if it‘s a request for HTML        RewriteRule ^(?!.*?(\.js|\.css|\.xml|\.less|\.png|\.jpg|\.jpeg|\.gif|\.pdf|\.doc|\.txt|\.ico|\.rss|\.zip|\.mp3|\.rar|\.exe|\.wmv|\.doc|\.avi|\.ppt|\.mpg|\.mpeg|\.tif|\.wav|\.mov|\.psd|\.ai|\.xls|\.mp4|\.m4a|\.swf|\.dat|\.dmg|\.iso|\.flv|\.m4v|\.torrent|\.ttf|\.woff))(.*) http://service.prerender.io/http://example.com/$2 [P,L]    </IfModule>    # Rewrite everything else to index.html to allow html5 state links    RewriteRule ^ index.html [L]</IfModule>

要確保mod_headers、 mod_rewrite、mod_proxy_http三個模組都已經啟用。

 

配置成功後在prerender.io的cached pages會有它快取頁面面,這裡也可以自己手動添加。   搜尋引擎的抓取情況會這Crawl stats中反應出來。 接下來就看看網站的在各個搜尋引擎的收錄情況吧,google還是收錄比較快的,百度都無力吐槽了實在太慢了,反正我配置好一個星期之內百度是一點反應都沒有,不知道時間長了怎麼樣。暫時先這樣。 參考https://prerender.io/js-seo/angularjs-seo-get-your-site-indexed-and-to-the-top-of-the-search-results/https://scotch.io/tutorials/angularjs-seo-with-prerender-iohttp://www.oschina.net/translate/angularjs-seo-with-prerender-io

使用Prerender.io為angular項目做SEO

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.