問題
我有一個使用Angular構建並託管在Amazon S3上的靜態SPA網站。我試圖使抓取工具可以對預渲染的頁面進行訪問,但我無法重定向抓取工具請求,因爲Amazon S3不提供URL Rewrite選項,並且重定向規則有限。如何在使用Amazon S3時將抓取工具請求重定向到預先呈現的頁面?
我有什麼
我已經添加了下列元標記來我的index.html的<head>
頁:
<meta name="fragment" content="!">
而且,我的SPA採用簡潔的URL(不散列#
符號)與HTML5推狀態。
使用此設置,當爬蟲發現我的http://mywebsite.com/about
鏈接時,它將發出GET
請求http://mywebsite.com/about?_escaped_fragment_=
。這是一個pattern defined by Google,其次是其他爬蟲。
我需要的是用about.html文件的預渲染版本來回答此請求。我已經使用Phantom.js完成了此預渲染,但由於Amazon S3沒有重寫規則,因此無法爲抓取工具提供正確的文件。
在nginx的服務器,解決辦法是增加一個重寫規則,如:
location/{
if ($args ~ "_escaped_fragment_=") {
rewrite ^/(.*)$ /snapshots/$1.html break;
}
}
但在亞馬遜S3,我被他們的redirect rules基於KeyPrefixes和HttpErrorCodes限制。 ?_escaped_fragment_=
不是KeyPrefix,因爲它出現在URL的末尾,並且它不會提供HTTP錯誤,因爲Angular會忽略它。
我已經試過
我已經開始使用帶有ngRoute動態模板嘗試,但後來我意識到,因爲我針對爬蟲能我不能與任何角度的解決方案解決了這個」執行JavaScript。
有了Amazon S3,我必須堅持使用他們的重定向規則。
我設法使用一種醜陋的解決方法來處理它。如果我爲每個頁面的新規則,我做:
<RoutingRules>
<!-- each page needs it own rule -->
<RoutingRule>
<Condition>
<KeyPrefixEquals>about?_escaped_fragment_=</KeyPrefixEquals>
</Condition>
<Redirect>
<HostName>mywebsite.com</HostName>
<ReplaceKeyPrefixWith>snapshots/about.html</ReplaceKeyPrefixWith>
</Redirect>
</RoutingRule>
</RoutingRules>
正如你可以在此解決方案看,每一頁都需要它自己的規則。由於亞馬遜限制只有50個重定向規則,這不是一個可行的解決方案。
另一種解決方案是忘掉漂亮的URL並使用hashbangs。有了這個,我的鏈接將是http://mywebsite.com/#!about
,爬蟲將要求這與http://mywebsite.com/?_escaped_fragment_=about
。由於URL將以?_escaped_fragment_=
開頭,因此可以使用KeyPrefix捕獲,只需一個重定向規則即可。但是,我不想使用醜陋的URL。
那麼,我該如何在亞馬遜S3中使用靜態SPA並對搜索引擎友好?
剛寫完我的問題後,我已經意識到如何解決這個問題。由於我花了很多時間試圖找出錯誤的路徑,所以我在下面發佈了我的答案,希望能夠幫助其他人。 – Zanon