2013-07-01 13 views
1

我有一個AngularJS應用程序,我想在Google上正確索引。Nginx配置服務快照到谷歌機器人

我寫了一個客戶端,爲鏈接刮臉,然後用Phantomjs下載頁面製作快照。這一切工作正常。我遇到的問題是將這些快照提供給Google bot。

出於某種原因,Google bot會將?_escaped_fragment=附加到我的網址中。例如,http://me.com/about變爲http://me.com/about?_escaped_fragment=。我已經在訪問日誌中驗證了這一點。

我試圖抓住這個請求,並服務於谷歌機器人快照與此配置:

location/{ 
    if ($args ~ "_escaped_fragment_=") { 
     rewrite^/snapshots/$1; 
    } 
} 

然而,此項請求URL:http://me.com/about?_escaped_fragment=總是導致404同樣的,其他頁面。

快照存儲在相對於網站根目錄的/snapshots中。它們按照目錄結構命名,因此http://me.com/business/register/snapshots/business/register.html中有一個快照。

如何才能讓這些快照正常工作?

謝謝。

回答

0

好的,首先讓我解釋爲什麼谷歌使用?_escaped_fragment_,這是用於依賴ajax的網站,並使用散列標記他們的頁面,例如,如果你有http://example.com/gallery/#!image1和每次用戶更改到下一個更新的圖像散列到image2,image3,但如果用戶直接去http://example.com/gallery/#!image50您的JavaScript使用該哈希直接加載第50個圖像,而不是image1(服務器無法看到哈希部分,只有javascript可以)。 因此谷歌使用這個_excaped_fragment_告訴服務器它試圖緩存哪個頁面。

詳細解釋使用本link

至於爲什麼你得到一個404錯誤,我想是因爲你使用了$1不使用捕獲塊,正確的規則是這樣的

location/{ 
    if ($args ~ "_escaped_fragment_=(.*)") { 
     rewrite^/snapshots/$1; 
    } 
} 

但我不認爲這會解決你的問題,因爲根據你的例子,你沒有使用散列,你使用頁面的URI,所以我會重寫規則到這樣的事情

location/{ 
    # try snapshot, if not found try direct file. 
    try_files snapshots$request_uri.html $uri; 
} 
location/{ 
    # try snapshot, if not found try direct file. 
    try_files snapshots$request_uri.html $uri; 
} 
0

這裏是我在nginx中的工作,它工作正常,您可能需要爲index.html添加一個特殊的標記。訪問您的網站的根目錄)時

if ($args ~ "_escaped_fragment_=/(.+)/?") { 
    set $path $1; 
    rewrite^/snapshots/$path.html; 
    break; 
} 

location /snapshots/ { 
internal; 
    alias /var/www/snapshots/; 
} 

所以http://me.com/?_escaped_fragment_=/about將訪問/var/www/snaphots/about.html

不要忘了這個元標記,以及在你的頁面,如果您使用HTML pushState的而不是hashbangs:

meta(name="fragment", content="!")