我有一个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
中有一个快照。
如何让这些快照生效?
感谢。
答案 0 :(得分: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;
}
答案 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="!")