1

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

我写了一个客户端,它从网站上抓取链接,然后用 Phantomjs 制作快照下载页面。这一切都很好。我遇到的问题是将这些快照提供给 Google 机器人。

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

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

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.

我该怎么做才能让这些快照正常工作?

谢谢。

4

2 回答 2

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="!")
于 2013-08-18T06:28:51.873 回答
0

好的,首先让我解释一下为什么 google 使用?_escaped_fragment_,这用于依赖 ajax 的网站,并用哈希标记他们的页面,例如,如果您有http://example.com/gallery/#!image1并且每次用户更改为下一个图像时您将哈希更新为image2, image3, 但是如果用户直接访问http://example.com/gallery/#!image50您的 javascript,则使用该哈希直接加载第 50 张图像而不是 image1(服务器看不到哈希部分,只有 javascript 可以)。所以谷歌使用它_excaped_fragment_来告诉服务器它试图缓存哪个页面。

有关更多说明,请使用此链接

至于为什么会出现 404 错误,我认为是因为您使用 a$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;
}
于 2013-07-01T11:37:49.470 回答