Nginx配置为谷歌机器人提供快照

时间:2013-07-01 08:56:18

标签: angularjs nginx snapshot

我有一个AngularJS应用程序,我想在Google上正确编入索引。

我写了一个客户端,用于抓取链接的网站,然后使用Phantomjs下载页面制作快照。一切正常。我遇到的问题是将这些快照提供给谷歌机器人。

出于某种原因,Google机器人会将?_escaped_fragment=添加到我的网址中。例如,http://me.com/about已更改为http://me.com/about?_escaped_fragment=。我已经在访问日志中验证了这一点。

我正在尝试捕获此请求,并使用此配置向Google bot提供快照:

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

但是,请求此网址:http://me.com/about?_escaped_fragment=始终会生成404.与其他网页相同。

快照存储在/snapshots中,相对于网站的根目录。它们以其网页命名,遵循目录结构,因此http://me.com/business/register/snapshots/business/register.html中有一个快照。

如何让这些快照生效?

感谢。

2 个答案:

答案 0 :(得分:0)

好的,首先让我解释为什么谷歌使用?_escaped_fragment_,这用于依赖ajax的网站,并用哈希标记他们的页面,例如,如果你有http://example.com/gallery/#!image1,每次用户更改到下一个图像,您将哈希更新为image2image3,但如果用户直接转到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;
}

答案 1 :(得分: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="!")