我按照谷歌指南Making AJAX applications crawlable使我的AngularJS应用程序可以抓取用于搜索引擎优化目的。所以我正在使用#! (hashbang)在我的路线配置中:
$locationProvider.hashPrefix('!');
所以我的网址如下:
http://www.example.com/#!/page1.html
http://www.example.com/#!/page2.html
...
谷歌将hashbangs (#!)
替换为?_escaped_fragment_=
我通过我的.htaccess
文件将谷歌机器人重定向到该页面的快照:
DirectoryIndex index.html
RewriteEngine On
RewriteCond %{QUERY_STRING} ^_escaped_fragment_=/?(.*)$
RewriteRule ^(.*)$ /snapshot/%1? [NC,L]
到目前为止,一切都像魅力一样。当机器人请求关注URL http://www.example.com/#!/page1.html
时,它将替换hashbang并实际请求http://www.example.com/?_escaped_fragment_=/page1.html
,我将其重定向到所请求页面的静态/预渲染版本。
所以我通过Google Webmaster Tools的sitemap.xml
提交了Search Console
。我的站点地图中的所有网址都由谷歌正确编制索引,但不是域名本身。所以它意味着像:
http://www.example.com/#!/page1.html
已正确编入索引,并且通过Google搜索我的任何子页面的特定内容,Google会找到正确的页面。问题是start/homepage
本身“自然”没有hashbang:
http://www.example.com/
当用户访问该网站时,此处附加了hashbang(通过我的路由器配置中的javascript)。但看起来谷歌机器人的情况并非如此。
因此抓取工具不会“看到”hashbang,因此不会使用静态版本,这是一个很大的问题,因为特别是在这里我提供了最重要的内容。
我已经尝试重写并通过/
将.htaccess
重定向到/#!/
,但最终会导致许多重定向并导致崩溃。我也尝试过使用
<meta name="fragment" content="!">
{p}在index.html
的标题中。但这根本没有帮助。
有没有其他人在遇到过这个问题?